← все записи

Linux: советы для разработчика, которые я хотел знать раньше

21 августа 2025 · Alex Volk
Linux CLI

После нескольких лет работы в Linux замечаешь одно: большинство вещей, которые казались магией, на самом деле просто инструменты, о которых никто не рассказывает в tutorial'ах. Вот мой список того, что реально пригодилось.

strace — когда программа ведёт себя странно

Если процесс завис или делает что-то непонятное, strace покажет все системные вызовы. Для уже запущенного процесса:

strace -p <PID> -e trace=network,read,write 2>&1 | head -50

Для диагностики медленного старта приложения:

strace -tt -T -e trace=openat,read ./myapp 2>&1 | grep -E "open|slow"

Флаг -T показывает время выполнения каждого syscall — отлично для поиска тормозов на I/O.

lsof — кто держит файл или порт

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

# Кто слушает порт 8080
lsof -i :8080

# Все открытые файлы процесса
lsof -p <PID>

# Открытые сетевые соединения
lsof -i -n -P | grep ESTABLISHED

Замена find на fd

Утилита fd — это то, каким должен был быть find. Синтаксис человеческий, работает быстро, по умолчанию игнорирует .gitignore:

# Найти все Python файлы
fd -e py

# Найти файлы с 'config' в имени, изменённые за последние 2 дня
fd config --changed-within 2d

# Выполнить команду для каждого результата
fd -e log -x gzip {}

ripgrep вместо grep

rg — grep, который умеет в Unicode, рекурсивный поиск, и делает всё это быстро:

# Искать по всем Python файлам в проекте
rg "def connect" --type py

# Показать контекст вокруг совпадения
rg "ERROR" -C 3 /var/log/app/

# Поиск с заменой (--replace выводит в stdout, не меняет файл)
rg "old_func" --replace "new_func" -l

awk для быстрой обработки логов

Не надо учить awk полностью — достаточно нескольких паттернов:

# Посчитать уникальные IP из access.log (поле $1)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20

# Сумма времён запросов (поле $NF — последнее)
awk '{sum+=$NF} END {print "Total:", sum, "Avg:", sum/NR}' times.log

# Фильтр строк где 4-е поле > 1.0 (медленные запросы)
awk '$4 > 1.0 {print $0}' requests.log

Работа с процессами: htop, ps, kill

В htop нажми F5 для tree view — сразу видно parent/child процессы. Полезно когда нужно понять иерархию сервисов.

# Все процессы Python с аргументами
ps aux | grep python | grep -v grep

# Убить все процессы по имени
pkill -f "gunicorn worker"

# Отправить SIGHUP (перечитать конфиг)
pkill -HUP nginx

journalctl — работа с systemd логами

Чаще всего использую:

# Последние 100 строк с live tail
journalctl -u myservice -n 100 -f

# Логи за последний час
journalctl -u myservice --since "1 hour ago"

# Только ошибки
journalctl -u myservice -p err

# Логи с момента последнего старта сервиса
journalctl -u myservice -b -1

Несколько мелочей напоследок

Несколько вещей, которые вошли в muscle memory:

Список конечно неполный — добавлю ещё в следующих постах. Если что-то из своего арсенала хочется поделиться — пишите в Telegram.