Linux: рабочая памятка инженера

Команда полезна только вместе с моделью: процесс имеет PID, открытые files/descriptors, environment и права; сеть имеет sockets; systemd управляет services; filesystem хранит owner/group/mode.

Файлы и поиск

pwd
ls -la
find . -type f -name '*.log'
rg 'ERROR|Exception' ./logs
du -sh ./*
df -h

du показывает занятое файлами в дереве, df — состояние filesystem. Удалённый, но ещё открытый процессом файл освобождает место только после закрытия descriptor; это можно увидеть через lsof.

Безопасные операции:

cp -a source backup
mkdir -p ./var/data
mv old-name new-name

Перед рекурсивным удалением сначала вывожу точный resolved target. Не запускаю destructive-команду с пустой переменной, широким glob или неизвестным рабочим каталогом.

Процессы

ps aux
pgrep -af java
top
kill -TERM 12345
kill -KILL 12345

SIGTERM даёт процессу шанс завершиться корректно; SIGKILL ядро применяет немедленно, обработать его нельзя. Высокий load average не равен CPU usage: в него могут входить задачи, ожидающие uninterruptible I/O.

Сервисы и журналы

systemctl status demo.service
journalctl -u demo.service --since '10 minutes ago'
journalctl -u demo.service -f

Сначала читаю status и свежие logs, затем конфигурацию unit и environment. Бесконечный restart loop способен скрыть исходную ошибку и усилить нагрузку.

Сеть

ss -lntp
getent hosts api.example.test
nc -vz api.example.test 443
curl -v --connect-timeout 3 "$DEMO_ENDPOINT/health"

Порядок проверки: DNS → route/connect → TLS → HTTP → application. См. Веб протоколы.

Права

id
stat ./app.jar
chmod u+x ./mvnw

В rwxr-x--- первые три бита относятся к owner, затем group, затем others. chmod 777 маскирует причину и расширяет доступ; сначала проверяю owner/group и требуемую операцию.

Потоки данных

command >stdout.log 2>stderr.log
command 2>&1 | tee combined.log

> перезаписывает файл, >> дописывает. Pipeline по умолчанию может вернуть status последней команды; в скриптах учитываю set -o pipefail.

Типичные сбои

  • Файл существует, но процесс не имеет execute/search permission на родительский каталог.
  • Порт слушается только на 127.0.0.1.
  • Диск “полон” по inodes, хотя свободны гигабайты.
  • Java-процесс убит OOM killer; application log обрывается без stack trace.
  • Скрипт зависит от интерактивного shell и падает под systemd/CI.

Вопросы для собеседования

Чем SIGTERM отличается от SIGKILL? Первый можно обработать для graceful shutdown, второй — нельзя.

Почему место не освободилось после удаления log? Процесс продолжает держать открытый descriptor.

Чем stdout отличается от stderr? Это отдельные file descriptors 1 и 2, их можно перенаправлять независимо.

Что показывает ss -lntp? Слушающие TCP sockets и, при достаточных правах, процессы.

Зачем execute bit каталогу? Он разрешает проход и доступ к entries по имени.

См. Docker, SSH протокол, Как я веду и публикую JavaNotes.