9 October 2015

Supervisord и forever больше не нужны. Systemd

Configuring LinuxSystem administration
В статье речь будет идти о 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.
Tags:Debian 8systemdjessiesupervisordforever
Hubs: Configuring Linux System administration
+15
41.8k 160
Comments 67
Top of the last 24 hours