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