Linux: советы для разработчика, которые я хотел знать раньше
После нескольких лет работы в 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:
Ctrl+Rв bash — поиск по истории команд. Жмёшь ещё раз — идёт дальше назад.cd -— перейти в предыдущую директорию.!!:последняя команда.sudo !!— повторить с sudo.watch -n 2 'df -h'— мониторить любую команду каждые 2 секунды.tee /tmp/output.txt— вывести в stdout и одновременно записать в файл.
Список конечно неполный — добавлю ещё в следующих постах. Если что-то из своего арсенала хочется поделиться — пишите в Telegram.