Что происходит с процессами, запущенными init через сценарий инициализации, если для этого сценария нет соответствующего K
запись в (например) /etc/rc0.d/
?
Например, следующий сценарий запускает демонизированный процесс:
-rwxrwxr-x. 1 root root 3.3K Jul 16 11:48 /etc/rc3.d/S99foobar
Нет соответствующей ссылки (например, /etc/rc0.d/K99foobar
) для обработки завершения этих процессов во время выключения / перезагрузки.
Получают ли эти процессы сообщение SIGTERM, за которым следует SIGKILL, от init, когда они выполняются последними? Или init достаточно умен, чтобы позвонить /etc/init.d/foobar stop
?
Если вы внимательно посмотрите на процесс завершения работы, вы увидите, что после того, как практически все будет сделано, init убьет все, что еще работает.
В системе Red Hat / CentOS 6 вы увидите:
Sending all processes the TERM signal...
через несколько секунд
Sending all processes the KILL signal...
Все, что к тому времени не было закрыто, будет убито. Это в /etc/rc.d/init.d/halt
сценарий, который является последним сценарием, запускаемым при выключении системы.
После этого halt
начинает размонтировать файловые системы и выполнять другую окончательную очистку перед выключением, а затем, наконец, фактически останавливает или перезагружает систему.
Все остальные дистрибутивы, использующие выскочку или SysVinit, делают нечто подобное.
Обратите внимание, что эта проблема не возникает с systemd, потому что он всегда знает, какие службы он запустил.
В конце концов, после снятия всего, что может быть сбито, все оставшееся получает «kill -9».