DevOps Portal | Linux
13.4K subscribers
868 photos
112 videos
10 files
882 links
Присоединяйтесь к нашему каналу и погрузитесь в мир DevOps

Связь: @devmangx

РКН: https://clck.ru/3P8kFH
Download Telegram
🐧 Управление процессами в Linux: как держать систему под контролем

Разберем, как мониторить процессы, управлять их состоянием и настраивать автоматическое выполнение задач.

Процесс — это программа, запущенная в системе. У каждого процесса есть уникальный идентификатор (PID), родительский процесс (PPID) и состояние (активный, спящий и т. д.).

Основные действия с процессами:
🔹Мониторинг — отслеживание текущих процессов.
🔹Управление — остановка, возобновление, изменение приоритетов.
🔹Планирование — настройка задач для автоматического выполнения.

Команды для работы с процессами

1️⃣Мониторинг процессов

🟢 Просмотр активных процессов:
ps aux

Выводит список всех процессов с подробной информацией:
🔹USER — пользователь, запустивший процесс.
🔹PID — уникальный идентификатор процесса.
🔹%CPU / %MEM — использование процессора и памяти.
🔹COMMAND — название программы.

🟢 Интерактивный мониторинг:
top

Показывает процессы в реальном времени. Нажмите q, чтобы выйти.

🟢 Упрощенная альтернатива:
htop

Если не установлено, добавьте:
sudo apt install htop


2️⃣ Управление процессами

🟢 Завершение процесса:
kill <PID>

Например:
kill 1234

Чтобы принудительно завершить процесс:
kill -9 <PID>


🟢 Остановка и возобновление:

🔹Остановить процесс:
kill -STOP <PID>

🔹Возобновить процесс:
kill -CONT <PID>


🟢 Изменение приоритета процесса:

🔹Проверить приоритет (niceness):
ps -o pid,ni,cmd -p <PID>

🔹Изменить приоритет (чем ниже значение, тем выше приоритет):
renice -n 10 -p <PID>


3️⃣ Планирование задач

🟢 Запуск в фоне: Если команда занимает много времени, добавьте & в конце:
long_running_command &

Узнать PID фонового процесса:
jobs -l


🟢 Отложенный запуск: Используйте at, чтобы запланировать выполнение команды:
echo "backup.sh" | at 02:00

Если at не установлен:
sudo apt install at


🟢Периодические задачи: Для регулярных задач используйте cron:
1. Открыть редактор crontab:
crontab -e

2. Добавить задачу (пример: запуск каждую минуту):
* * * * * /path/to/script.sh


⚡️ Советы

Используйте htop для удобной работы с процессами, если командная строка кажется сложной.
Команда pkill позволяет завершить процессы по имени:
pkill firefox

Следите за потреблением ресурсов с помощью iotop (для ввода-вывода) и nmon (общий мониторинг).

Заключение

Управление процессами — это важнейшая часть работы в Linux. Знание этих инструментов позволит вам не только следить за состоянием системы, но и эффективно решать проблемы производительности. 😐

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍106
Мониторинг сети с помощью Python: Начни с SNMP и PySNMP

Мониторинг сетевой инфраструктуры — это основа стабильной работы ИТ-экосистемы. С помощью Python и библиотеки PySNMP можно собрать данные о состоянии устройств и использовать их для анализа или визуализации. Сегодня рассмотрим пример простого скрипта для сбора информации через SNMP.

Что такое SNMP?

SNMP (Simple Network Management Protocol) — это стандартный протокол управления сетями. Он используется для:

🔹Сбора метрик с устройств (CPU, память, трафик интерфейсов).
🔹Отправки уведомлений о событиях.
🔹Управления конфигурацией.

Установка PySNMP

Для работы установим библиотеку PySNMP:
pip install pysnmp


Пример скрипта: Сбор метрик интерфейса

Вот пример кода, который получает статистику интерфейса по OID:
from pysnmp.hlapi import *

# Укажите параметры устройства
snmp_target = '192.168.1.1'
community = 'public'
oid = '1.3.6.1.2.1.2.2.1.10.1' # OID для входящего трафика интерфейса

# Запрос SNMP
def get_snmp_data(target, community, oid):
iterator = getCmd(
SnmpEngine(),
CommunityData(community, mpModel=0),
UdpTransportTarget((target, 161)),
ContextData(),
ObjectType(ObjectIdentity(oid))
)
error_indication, error_status, error_index, var_binds = next(iterator)

if error_indication:
print(f"Error: {error_indication}")
elif error_status:
print(f"Error: {error_status.prettyPrint()}")
else:
for var_bind in var_binds:
print(f"{var_bind[0]} = {var_bind[1]}")

# Выполнение запроса
get_snmp_data(snmp_target, community, oid)


Как это работает:
1. getCmd выполняет запрос на устройство по указанному OID.
2. CommunityData указывает тип доступа (public — стандартное имя сообщества для чтения).
3. Результат содержит текущую метрику (например, объем входящего трафика на интерфейсе).

Применение:
🔹Получите данные о загрузке процессора, памяти или состоянии интерфейсов.
🔹Интегрируйте скрипт в существующую систему мониторинга.
🔹Расширьте функционал для уведомлений или построения графиков.

Что дальше?

Для визуализации собранных данных можно использовать библиотеки, такие как Matplotlib или Pygal. Это позволяет легко строить графики, показывающие состояние сети.

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151
💡 Короткий совет по Linux

Если вы хотите очистить пустые каталоги, команда find может упростить эту работу:
$ find . -type d -empty -exec rmdir -v {} +
Параметр -type d выполняет поиск каталогов, -empty выбирает пустые каталоги, а -exec rmdir {} выполняет команду rmdir для их удаления.

Команда rmdir гарантирует, что каталог пуст перед его удалением.

В качестве альтернативы, вы также можете использовать эту команду для выполнения той же задачи:
$ find . -type d -empty -delete

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥41
KodeKloud Free Labs — площадка c интерактивными заданиями и реальными сценариями, которые помогут погрузиться в практическое применение принципов DevOps и облачных технологий, не выходя из браузера.

В бесплатных лабах сейчас есть: Linux, Кубер, Docker, GiT, Python и прочие прелести.

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍20🔥92🤝1
Чем отличается CMD от ENTRYPOINT в Dockerfile?

Инструкции CMD и ENTRYPOINT выполняются в момент запуска контейнера, тольо инструкция CMD позволяет переопределить передаваемые команде аргументы.

Пример 1. CMD: Опишем сборку образа в Dockerfile.
FROM alpine
CMD ["ping", "8.8.8.8"]



В инструкцию CMD передаются 2 аргумента. Выполним сборку образа docker build -t test . и запустим контейнер.
$ docker run test
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=43 time=32.976 ms
64 bytes from 8.8.8.8: seq=1 ttl=43 time=31.998 ms
64 bytes from 8.8.8.8: seq=2 ttl=43 time=31.843 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 31.708/33.316/36.823 ms



Теперь передадим 2 новых аргумента для запуска контейнера.
$ docker run test traceroute 1.1.1.1
traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 46 byte packets
1 172.17.0.1 (172.17.0.1) 0.017 ms 0.016 ms 0.009 ms
2 192.168.168.1 (192.168.168.1) 0.996 ms 1.553 ms 2.069 ms
3 * * *
4 lag-2-435.bgw01.samara.ertelecom.ru (85.113.62.125) 1.454 ms 1.427 ms 1.984 ms
5 172.68.8.3 (172.68.8.3) 19.685 ms 15.722 ms 15.565 ms
6 172.68.8.2 (172.68.8.2) 15.846 ms 22.696 ms 35.093 ms
7 one.one.one.one (1.1.1.1) 17.439 ms 17.670 ms 24.202 ms


ping заменен на traceroute, IP адрес заменен на 1.1.1.1.


Пример 2. ENTRYPOINT: Опишем сборку образа в Dockerfile.
FROM alpine
ENTRYPOINT ["ping", "8.8.8.8"]



В инструкцию ENTRYPOINT передаются 2 аргумента. Выполним сборку образа docker build -t test . и запустим контейнер.
$ docker run test2
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=43 time=36.189 ms
64 bytes from 8.8.8.8: seq=1 ttl=43 time=44.120 ms
64 bytes from 8.8.8.8: seq=2 ttl=43 time=44.584 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 36.189/41.631/44.584 ms



Теперь передадим изменим один из аргументов для запуска контейнера.

$ docker run test2 ping 1.1.1.1
BusyBox v1.31.1 () multi-call binary.

Usage: ping [OPTIONS] HOST

Send ICMP ECHO_REQUEST packets to network hosts

-4,-6 Force IP or IPv6 name resolution
-c CNT Send only CNT pings
-s SIZE Send SIZE data bytes in packets (default 56)
-i SECS Interval
-A Ping as soon as reply is recevied
-t TTL Set TTL
-I IFACE/IP Source interface or IP address
-W SEC Seconds to wait for the first response (default 10)
(after all -c CNT packets are sent)
-w SEC Seconds until ping exits (default:infinite)
(can exit earlier with -c CNT)
-q Quiet, only display output at start
and when finished
-p HEXBYTE Pattern to use for payload



Как видим, аргумент передать контейнеру нельзя.

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥6🤔4
Linux. Карманный справочник. 4-е изд

Автор: Дэниел Джей
Год: 2024

📂 Скачать книгу

👉 DevOps Portal | #книги
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥9
This media is not supported in your browser
VIEW IN TELEGRAM
Dockly

Это интерактивный терминальный интерфейс для управления контейнерами Docker.

Утилита позволяет в режиме реального времени просматривать активные контейнеры, образы и сети, выполнять команды, такие как перезапуск или удаление контейнеров, а также получать доступ к их логам и ресурсам.

Подходит для разработчиков и администраторов, которым нужен быстрый и удобный способ мониторинга и управления Docker-средами.

GitHub: dockly

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3🤝1
Программа сообщает о том, что не может найти свой конфиг. Каким образом можно узнать, где она пытается его найти?

line-buffered опция которая выведет результат как только найдет

strace -f — отслеживание дочерних процессов

strace -f l ftp sitename | & grep --line-buffered open | grep /home/user

Либо в самой программе, если удастся найти параметры

/usr/sbin/mysqld --verbose --help | grep -A 1 «Default options»

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
DistroSea

Удобный способ протестировать операционные системы перед установкой.

Сервис позволяет запустить десятки дистрибутивов Linux, ознакомиться с интерфейсом, протестировать функционал и поработать в терминале.

👉 distrosea.com

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Ansible против bash-скрипта 😀

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
😁55👍10
ssh commands cheat sheet.pdf
1.5 MB
🔥 Шпаргалка по SSH-командам

Давно не делились полезными шпаргалками! Держите – объемная подборка по SSH: от базовых команд до туннелирования

Сохраняй, пригодится 😎

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥7
Примеры типовых операций в bash-скриптах

Арифметические действия, циклы по кол-ву раз

#!/bin/bash
A="10"
B="5"
C=`expr $A + $B`
printf "A=10 B=5 C=expr \$A + \$B C=%d \n" "$C"

# пример цикла по i
I=0
while [ $I -lt 15 ]
do
printf "0x%02x " "$I"
I=`expr $I + 1`
done
echo



Разного рода проверки

#!/bin/bash
# пример проверки существования файла
# создаем файл test1
touch test1
# проверяем существование файла test1
if [ -f test1 ] ; then
echo "файл test1 существует"
fi
# проверяем несуществование файла test2
if ! [ -f test2 ] ; then
echo "файл test2 не существует"
fi
# краткая справка по другим опциям команды [ ]
# -d filename директория существует
# -f filename файл существует
# -L filename символьная ссылка существует
# -r, -w, -x файл доступен для чтения, записи или выполнения
# -s filename файл существует и имеет ненулевую длину
# f1 -nt f2 f1 новее чем f2
# f1 -ot f2 f1 старше чем f2



Работа с FTP

#!/bin/bash
ADDRESS=192.168.1.150
USER=root
PASSWORD=root
ftp -n -p ADDRESS <<EoF
user USER PASSWORD
cd /usr/bin
put my_cool_program
quit
EoF
exit 0



Работа с telnet

#!/bin/bash
(
sleep 1
echo "root"
echo "cd /tmp"
echo "ls"
sleep 1
echo "quit"
) | telnet 192.168.1.150

Примечание: в этом случае root логинится без пароля, если нужен пароль, то надо добавить после echo "root" еще одно эхо с паролем.

Пример цикла по множеству значений

#!/bin/bash
# пример цикла по множеству значений
for A in раз два три четыре пять
do
echo "$A,"
done
echo "вышел заяц погулять"
echo


Не забываем, что для того, чтоб скрипт можно было запустить, надо изменить права доступа к нему, добавив возможность исполнения файла, например командой

chmod a+x
script.sh

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
Топ 4 лучших типа сервисов Kubernetes в одной диаграмме.

👉 ClusterIP
ClusterIP - это стандартный и наиболее распространенный тип службы. Kubernetes назначает сервису ClusterIP внутренний IP-адрес кластера. Это делает службу доступной только в пределах кластера.

👉 NodePort
Это позволяет вывести сервис за пределы кластера, добавив общекластерный порт поверх ClusterIP. Мы можем запросить сервис по NodeIP:NodePort.

👉 LoadBalancer
Этот способ раскрывает сервис извне, используя балансировщик нагрузки облачного провайдера.

👉 ExternalName
Сопоставляет службу с доменным именем. Обычно это используется для создания службы в Kubernetes для представления внешней базы данных.

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81
Самоучитель по CI/CD в K8s

Отличный ресурс, чтобы освоить Kubernetes и научиться доставлять в него код своих приложений

Пошаговые инструкции, теория и примеры кода помогут быстро погрузиться в процесс

Выбирайте свою технологию:

👉 Node.js
👉 Spring Boot
👉 Django
👉 Go
👉 Rails
👉 Laravel

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10👀2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁40👍3🤝1
Чем отличается su от sudo?

su «substitute user» — заменить пользователя
sudo «substitute user and do» — подменить пользователя и выполнить

su требует пароль целевой учетной записи, на кого переключаемся.
sudo требует пароль текущего пользователя и запускает от его имени команды, которым требуются права суперюзера.

Например, мы сидим под пользователем user и хотим войти под John:

user@dev:/$ su john


Будет запрошен пароль, нужно ввести пароль именно от учетной записи john, а не от user.

А вот пример с sudo:

user@dev:/$ sudo -u john whoami


А здесь нужно ввести пароль от учетной записи user, а не от John или рута. Но для этого случая сперва необходимо добавить пермишены для пользователя user в файл /etc/sudoers.

user ALL=(ALL:ALL) ALL


Редактировать этот файл можно по средствам команды visudo. А свалидировать конфиг можно командой visudo -c. Редактирование этого файла через visodu хорошо тем, что если вы допустите ошибку, то при сохранении, оно сообщит о ней.


А для чего нужен дефис после su?

Для очистки переменных и чтобы пользоваться чистой оболочкой при переключении на другого пользователя.

Авторизуемся под пользователем user и экспортируем переменную:

ssh user@pc
export a="test"


Теперь у пользователя user есть переменная "a" которая = test.

Переключаемся на пользователя John и смотрим переменную "a"

su john
echo $a


Вывелась строчка test. То есть все что мы задали под user, перекочевало в оболочку john. А теперь добавим дефис:

su - john
echo $a


Переменная $a больше не выводится. Чистая оболочка. Кстати с этим дефисом часто косячат и потом долго не могут понять в чем причина. Переменные вроде были заданы, а потом куда-то пропали.

su (с дефисом) — сначала переключается пользователь, а затем запускается shell, зачищаются все переменные.


su (без дефиса) — переключает пользователя, оставляя переменные окружения старого пользователя.


У sudo есть подобные ключи -s -i

user@pc:/$ sudo -s


Запустится оболочка с правами root

user@pc:/$ sudo -i


Запустится оболочка, но уже с чтением файлов root/.profile/.bashrc и т.п. Можно попробовать добавить экспорт переменной в .profile, сделать sudo -s/-i и увидеть что с ключом -i переменная выведется на экран.

По сути sudo -i = команде sudo su -. Но обычно за sudo su - в приличных местах можно получить по шапке. Это плохая практика! Так как это порождает дополнительный процесс и больше гемора с набором самой команды.


👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39🔥107🤔1
👩‍💻 Топ-5 полезных утилит для Docker

Portainer — проект с открытым исходным кодом, представляющий собой образ графического web-интерфейса для управления Docker.

Hadolint — представляет собой утилиту, предназначенную для оценки Dockerfile с точки зрения корректности синтаксиса и безопасности инструкций.

Dozzle — представляет собой веб-интерфейс для отображения логов контейнеров в режиме реального времени.

Dive — утилита, которая визуально отображает подробную информацию о Docker образах и их слоях.

Ctop — утилита для мониторинга метрик в контейнерах, которая напоминает утилиту top в Unix системах.

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143
ZRAM позволяет сжимать оперативную память на лету и таким образом увеличить ее объём.

При включении zram, сжатие переносит часть нагрузки на процессор, но использование zram действительно может улучшить производительность.

Также есть zswap, которая сжимает данные в разделе подкачки. И которая по умолчанию включена почти во всех официальных ядрах.

Проблема zswap заключается в том, что его приоритет выше чем у zram, который остается неиспользуемым. Чтобы решить эту проблему, нужно отключить zswap в ядре.

CONFIG_ZSWAP_DEFAULT_ON=N


Но чтобы применить эту опцию, нужно пересобрать ядро. Пойдем легким путем и выключим zswap через загрузчик grub.

Редактируем файл /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=0" loglevel=3 quiet "


Не забываем перегенирировать конфиг grub:

grub-mkconfig -o /boot/grub/grub.cfg


Перезагружаем машину и проверяем отключение zswap:

cat /sys/module/zswap/parameters/enabled


Если вывелась буква N — значит все правильно.

Ну и наконец включаем zram. Для этого пишем bash скрипт и кидаем его в автозагрузку:

#!/bin/bash

modprobe zram
mkdir /sys/block/zram0
echo lz4 > /sys/block/zram0/comp_algorithm
echo 1G > /sys/block/zram0/disksize
echo 2 > /sys/block/zram0/max_comp_streams
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0


1. Загружаем модуль zram
2. Выбираем алгоритм сжатия lz4 (либо zstd)
3. Объем zram 1гиг физической оперативки
4. 2 это количество потоков сжатия (потоки процессора)
5. Создаем блочное устройство и включаем его

Запускаем скрипт и проверяем включение командой: zramctl. Если на экран что-то вывелось, значит всё хорошо и сжатие начало работать.

Если заморачиваться с bash скриптами не хочется, ставим утилиту которая будет работать через systemd.

apt install systemd-zram-generator


Правим конфиг /etc/systemd/zram-generator.conf

[zram0]
zram-size = ram
compression-algorithm = lz4


Активируем и запускаем:

systemctl daemon-reload
systemctl start /dev/zram0


Всё! Теперь оно само будет запускаться без лишних движений.

👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5
This media is not supported in your browser
VIEW IN TELEGRAM
SecretScanner

Ищет незащищённые креды и пароли в Docker-образах, контейнерах и на ПК.

Сканирует данные, сверяя их с базой из 140 типов секретов.

Входит в состав ThreatMapper — инструмента с открытым кодом для выявления и ранжирования уязвимостей в облачных приложениях.

👉 GitHub

👉 DevOps Portal | #ресурсы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Знали ли вы про такую команду в linux как - «yes»?

Команда yes служит для вывода в стандартный поток (stdout) строки «y» или любой другой строки. Если ее запустить по умолчанию, команда будет бесконечно сыпать строку «y».


Например, есть у вас консольная команда, которая во время своей работы будет запрашивать подтверждение: а вы точно уверены, что удаляете тестовую базу данных? Вот на такие случаи и нужна команда «yes», чтобы не руками вводить подтверждение, а делегировать это действие.

Полезно для пайплайнов. Бывает такое, что у программы нет ключей типа apt -y install, а подтверждать как-то в автоматическом режиме нужно.

Синтаксис проброса стандартный, через систему пайпов:

yes | apt install nginx


В примере выше, когда пакетный менеджер попросит нажать Y, команда «yes» автоматически это сделает и начнется процесс установки.

Не забываем, про передачу аргументов, если внешняя программа например хочет чтобы вы ввели слово: «hello» делаем так:

yes hello | apt install nginx


Но обычно на практике, в 99% случаев команда «yes» запускается без аргументов, так как большинство запрашивает именно Yes.


Если есть команда «yes», значит должна быть и «no». Но увы 😁. Так вот если нужно отменить, передайте в «yes» аргументом строку «no».

Что-то может запросить простого нажатия Enter, например когда в репозиторий добавляется gpg ключ. Как послать Enter? А вот так:

yes "" | <твоя команда>


Это сработает как Enter потому, что команда «yes» выводит в stdout не просто сроку Y, но еще и завершает ее в конце символом Enter. Вот именно поэтому при запуске чистого «yes», строчки на экране будут идти столбиком.


👉 DevOps Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥44👍8😁1