Процессы и службы — Примеры

Пример 1 — Процесс, не вернувшийся после перезагрузки

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

запущен руками:    оболочка входа -> ./sync-agent.sh    (родитель — оболочка)
после выхода:      оболочка исчезла, процесс был усыновлён и продолжал работать
после перезагрузки: ничто его не запускает, поэтому его нет и ошибки нигде нет

Решение

служба sync-agent
  command: /usr/local/bin/sync-agent.sh
  user:    sync-agent
  restart: on failure
  output:  системный журнал, под именем юнита

Объявление долго работающей команды под супервизором заставляет её стартовать при загрузке, перезапускаться при выходе и писать вывод туда, где его найдёт следующий исследователь. Дерево объясняет первое поведение: оно пережило выход только потому, что его родитель умер и процесс был усыновлён, а не потому, что за ним следили. Обычная ошибка — добавить строку в личный файл запуска и считать это надзором: он всё равно умирает вместе с сессией.

Пример 2 — Остановка обработчика без потери пакета

Обработчик на середине пакета записей, когда его нужно остановить. Два сигнала ниже — то, что оператор может послать. Скажите, что каждый делает с работой в полёте и как журнал показывает, какой был использован.

журнал обработчика: пакет начат, 40 записей
оператор:           посылает мягкий сигнал завершения
журнал обработчика: запрошена остановка; завершаем пакет из 40
журнал обработчика: пакет зафиксирован; выход с кодом 0

Решение

мягкий сигнал:   обработчик перестаёт принимать новую работу, завершает пакет, выходит с 0
жёсткий сигнал:  процесс уничтожается сразу; 40 записей в полёте теряются
улика:           последняя строка называет завершённый пакет и нулевой код возврата

Мягкий сигнал просит того же слива, что и любая остановка под оркестрацией: перестать брать новую работу, доделать то, что в полёте, затем выйти. Нулевой код возврата и последняя строка журнала фиксируют, что пакет дошёл до хранилища, — именно это делает остановку проверяемой. Обычная ошибка — сделать жёсткий сигнал значением по умолчанию, потому что он быстрее возвращает приглашение, так что пакет теряется, и в журнале об этом ничего нет.