Сценарии под /etc/init.d
связаны с sysvinit, почтенным и, к сожалению, довольно нарушенным подходом к управлению сервисами UNIX. Видите, процессы в UNIX образуют дерево: у каждого процесса есть родитель, процесс, который его запустил. Родитель имеет большой контроль над своими потомками и, что важно, уведомляется, когда умирает дочерний процесс. Практически тривиально поддерживать процесс в рабочем состоянии или выключать его, если вы его родитель.
И есть проблема: сценарий службы sysvinit запускает службу, а затем завершает работу, оставляя службу запущенной. Родительский процесс службы пропал, что затрудняет поиск и отслеживание службы. Когда сценарию sysvinit предлагается остановить службу, ему необходимо определить, какой процесс следует остановить, используя ненадежную информацию.
При правильных подходах к управлению сервисами, которые используются в runit и daemontools, сервисы запускаются контролирующими процессами, которые остаются после после запуска сервиса. Поскольку служба является дочерним процессом, процесс супервизора знает, работает ли он, произошел ли сбой, и где его найти, чтобы отправить ему сигналы.
Таким образом, в скрипте runit правильное выполнение - запуск самого nginx, а не сценария init.d. Это достаточно легко сделать. Однако по умолчанию nginx демонизирует себя, что означает, что он намеренно «убегает» от своего родительского процесса и становится очень трудно отследить. К счастью, такое поведение можно отключить, что является целью опции конфигурации daemon off;
. Действительный скрипт runit для nginx выглядит следующим образом:
#!/bin/sh
exec /usr/sbin/nginx -g "daemon off;"
Коротко и сладко. runit может очень хорошо управлять этим механизмом - он будет поддерживать работу nginx, и вы можете управлять им с помощью sv
. Например, sv hup nginx
говорит nginx перезагрузить свою конфигурацию. Конечно, PID изменится, если nginx аварийно завершит работу и будет перезапущен, или если вы намеренно попросите его перезапустить с помощью sv restart nginx
, но runit с этим справится.
(Между прочим, никогда никогда когда-либо используйте kill -9
, когда-либо. )