Supervisord и forever больше не нужны. Systemd
В статье речь будет идти о systemd, который вошел в Debian 8 jessie. Я пишу о Debian, потому что пользуюсь именно им. Пишу о systemd не потому что его фанат, но некоторые вещи меня действительно радуют.
Так почему же больше не нужны supervisord и forever?
Задача supervisord и его аналога написанного на nodejs — forever: демонизировать недемонизируемое и поднимать, когда оно падает. Эти задачи сейчас выполняет штатный systemd. Что в этом хорошего? Ну как минимум не нужны дополнительные инструменты (которых кстати не только два упомянутых) и есть штатное системное средство для решения таких задач.
Например очень легко настроить таким образом sshd, чтобы он поднимался в случае падения или kill. Нам нужно найти .service файл нашего sshd. Для этого выполним:
root@lynx:~# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Fri 2015-10-09 20:09:29 UTC; 55s ago
Main PID: 26884 (sshd)
CGroup: /system.slice/ssh.service
└─26884 /usr/sbin/sshd -D
Oct 09 20:09:29 lynx sshd[26884]: Server listening on 0.0.0.0 port 22.
Oct 09 20:09:29 lynx sshd[26884]: Server listening on :: port 22.
Собственно /lib/systemd/system/ssh.service и есть нужный нам файл. Вот такое его содержимое по умолчанию:
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target
Alias=sshd.service
В секции Service есть специальная опция “Restart” она как раз указывает, в каких случаях перезапускать сервис автоматически. Мы можем написать туда:
Restart=always
И при любом падении или попытке не взлететь sshd будет перезапущен. Чтобы изменения в файле вступили в силу, нужно выполнить:
root@lynx:~# systemctl daemon-reload
root@lynx:~# systemctl restart ssh
Теперь проверим, что сервис работает:
root@lynx:~# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Fri 2015-10-09 20:09:29 UTC; 3min 58s ago
Main PID: 26884 (sshd)
CGroup: /system.slice/ssh.service
└─26884 /usr/sbin/sshd -D
Oct 09 20:09:29 lynx sshd[26884]: Server listening on 0.0.0.0 port 22.
Oct 09 20:09:29 lynx sshd[26884]: Server listening on :: port 22.
Давайте убьем sshd и посмотрим как он запустился снова:
root@lynx:~# killall sshd
root@lynx:~# systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
Active: active (running) since Fri 2015-10-09 20:13:47 UTC; 1s ago
Main PID: 14123 (sshd)
CGroup: /system.slice/ssh.service
└─14123 /usr/sbin/sshd -D
Oct 09 20:13:47 lynx sshd[14123]: Server listening on 0.0.0.0 port 22.
Oct 09 20:13:47 lynx sshd[14123]: Server listening on :: port 22.
Видите, PID отличается — это говорит о том, что sshd действительно сдох, а systemd запустил его заново.
Поздравляю! Теперь Ваш sshd будет невозможно убить kill-ом и Ваш сервер будет доступен по ssh даже в случае убийства sshd.