Interview Questions
Linux

Сигналы и процессы

Редактировать на GitHub

Теоретические вопросы

Какой код сигнала будет выполнен при исполнении команды kill <PID>?

Сигнал SIGTERM (код 15) - это сигнал по-умолчанию отправляемый при вызове команды kill. Это указывает процессу на завершение работы и обычно считается сигналом для использования при чистом завершении работы.

Что такое сигнал в Unix, зачем они нужны и разница между 9 и 15 сигналами?

Сигнал - в Unix-like операционных системах - асинхронное (в случайное время) уведомление процесса для обработки какого-либо события. Один из основных способов взаимодействия между процессами.

Посылка сигналов от одного процесса к другому обычно осуществляется при помощи системного вызова kill. Его первый параметр – PID процесса, которому посылается сигнал; второй параметр – номер сигнала.

kill(1111, SIGTERM);

Стандарт POSIX определяет 28 сигналов. Некоторые из них:

СигналКодОписание
SIGTERM15Сигнал завершения (сигнал по умолчанию для утилиты kill)
SIGKILL9Безусловное завершение
SIGSTOP23Остановка выполнения процесса
SIGHUP1Закрытие терминала (перечитать конфигурацию)
SIGINT2Сигнал прерывания (Ctrl-C) с терминала

Какие состояния процессов существуют? Что значит состояние процесса D?

СтатусОписание
R (running or runnable)Выполняется или готов к выполнению
D (uninterruptible sleep)Ожидает записи на диск
S (interruptible sleep)Неактивен (< 20 s)
T (stopped by job control signal)Остановлен или трассируется отладчиком
Z (zombie)зомби
W (paging (not valid since the 2.6.xx kernel))Процесс выгружен на диск
<Процесс имеет повышенный приоритет nice
NПроцесс имеет пониженный приоритет nice
L (locked)Некоторые страницы блокированы в ядре
sПроцесс является лидеров сеанса

Что такое процесс-зомби и процесс-сирота? Можно ли самостоятельно сделать зомби?

Процесс-зомби - дочерний процесс в Unix-системе, завершивший своё выполнение, но ещё присутствующий в списке процессов операционной системы, чтобы дать родительскому процессу считать код завершения.

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

Убить зомби-процесс невозможно. Чтобы убить зомби-процесс нужно найти родительский процесс и завершить его или перезапустить. Найти зомби-процессы и их родителей можно следующей командой:

ps ajx | grep -w Z

PID'ы процессов родителей в 3 колонке. Убить процесс следующей командой:

kill -9 <PID процесса родителя>

Процесс-сирота — в семействе операционных систем UNIX вспомогательный процесс, чей основной процесс (или связь с ним) был завершен нештатно (не подав сигнала на завершение работы).

Отличие в том, что процесс-сирота (orphan process) всё еще активен. Его родительский процесс был по какой-либо причине прерван, и сирота теперь переходит под руководство init, чей ID процесса равен 1. PPID orphan процесса получит значение 1. Пользователь также может создать подобный процесс, отсоединив его от терминала. Сиротские процессы используют много ресурсов, их легко найти с помощью top или htop.

В отличии от процесса-сироты, зомби-процесс неактивен, но контролируется родительским процессом, пока тот не решит, что статус выхода дочерних процессов больше не нужен. Он не использует ресурсы и не может быть запланирован для выполнения. Иногда родительский процесс удерживает дочерний процесс в состоянии зомби, чтобы гарантировать, что будущие дочерние процессы не получат тот же PID. Если вы уничтожите родителя зомби-процесса, зомби-процесс тоже умрет. Для этого найдите родительский PID (PPID) зомби и отправьте ему сигнал SIGCHLD (17): kill -17 ppid.

Где в linux хранится информация о процессах?

Директория proc/PID. Информация о процессах хранится в директориях /proc/N, где N — числовой идентификатор процесса. В этой директории содержатся различные псевдо-файлы, которые содержат информацию о самом процессе и связанном с ним окружении.

  • /proc/N/cmdline — Содержимое командной строки, которой был запущен процесс.
  • /proc/N/environ — Описание окружения, в котором работает процесс. Оно может быть полезно для просмотра содержимого окружения, если вам надо, например, посмотреть, была ли установлена переменная окружения перед запуском программы.
  • /proc/N/exe — Символическая ссылка на выполнимый файл запущенной программы.
  • /proc/N/limits — Лимиты на использование системных ресурсов, актуальные для работающего процесса.
  • /proc/N/mounts — Список смонтированных ресурсов, которые доступны процессу
  • /proc/N/status — Статус работающей программы. Он включает в себя такую информацию как идентификатор родительского процесса, статус самого процесса, его название, его идентификатор, идентификатор пользователя и группы, группы, в которые входит владелец процесса, сколько потоков использует процесс, сколько памяти он использует и так далее.

В этой же директории содержится несколько псевдо-директорий:

  • /proc/N/cwd — Текущая директория для процесса. Представлена символической ссылкой на директорию. Если рабочая директория для процесса изменится, изменится и ссылка.
  • /proc/N/fd — Файловые дескрипторы, которые используются процессом. Для программы bash, например, там по умолчанию будут дескрипторы 0, 1, 2 и 255, указывающие на виртуальный терминал, в котором запущен процесс, например, /dev/pts/6.
  • /proc/N/fdinfo — Информация о файловых дескрипторах. Каждый файл в этой директории содержит поля pos (позиция курсора), flags (флаги, с которыми этот дескриптор был открыт) и mnt_id (идентификатор точки монтирования из списка, содержащегося в файле /proc/N/mountinfo)
  • /proc/N/root — Символическая ссылка на директорию, которая для данного процесса является корневой
  • /proc/N/net — Сетевые системные ресурсы и их параметры, действующие для конкретного процесса.

Практические вопросы

Как в systemd переопределить параметры юнита (service), не изменяя оригинальный unit-файл?

В systemd параметры юнита переопределяют через drop-in файл, не трогая оригинал.

Для этого выполняют:

systemctl edit <service>

Эта команда создаёт файл /etc/systemd/system/<service>.d/override.conf, в котором можно задать, например:

[Service]
Environment="JAVA_OPTS=-Xmx2G"

Затем делают:

systemctl daemon-reload
systemctl restart <service>

Так можно менять параметры без редактирования системного unit-файла.

Последнее обновление: 9 окт. 2025 г., 11:36:16