Автоперезапуск упавших сервисов Systemd

Автоматический перезапуск сервиса Systemd в случае падения

Неболь­шая замет­ка о том, как настро­ить авто­ма­ти­че­ский пере­за­пуск любо­го systemd-сер­ви­са в слу­чае его паде­ния не важ­но по какой при­чине.

Упасть сер­вис может по мно­же­ству при­чин, напри­мер из-за внут­рен­ней ошиб­ки или в слу­чае при­би­тия его мем­кил­ле­ром. С такой про­бле­мой я столк­нул­ся на Raspberry Pi, когда MariaDB у меня пери­о­ди­че­ски падала/выносилась earlyoom, с точ­ной при­чи­ной я не раз­би­рал­ся. Там усло­вия спар­тан­ские, опе­ра­тив­ной памя­ти все­го 1 Гб, поэто­му вме­сто стра­те­гии удер­жа­ния любой ценой про­цес­са в памя­ти я выбрал стра­те­гию пере­за­пус­ка сер­ви­са MariaDB когда по каким-либо при­чи­нам его выно­си­ло.

Дела­ет­ся это редак­ти­ро­ва­ни­ем несколь­ких строк в фай­ле systemd-юни­та сер­ви­са. В тер­ми­на­ле выпол­ня­ем:

sudo EDITOR=NANO systemctl edit service_name.service

Заме­ня­ем «service_name» на имя нуж­но­го сер­ви­са, напри­мер «sudo EDITOR=NANO systemctl edit mariadb.service».

После стро­ки «### Anything between here and the comment below will become the new contents of the file» добав­ля­ем сле­ду­ю­щее содер­жи­мое:

[Service] 
Restart=always 
RestartSec=5s

Пара­мет­ром «RestartSec» мож­но задать тай­маут, спу­стя кото­рый сер­вис будет пере­за­пу­щен. Сохра­ня­ем изме­не­ния и выхо­дим: CTRL+O -> ENTER -> CTRL+X. Далее при­ме­ня­ем новую кон­фи­гу­ра­цию юни­та:

sudo systemctl daemon-reload

Вот, в общем-то, и всё. Теперь Systemd будет пере­за­пус­кать сер­вис через задан­ный про­ме­жу­ток вре­ме­ни каж­дый раз, когда тот будет падать. Для про­вер­ки мож­но вруч­ную попри­би­вать про­цесс сер­ви­са и убе­дить­ся в том, что авто­ма­ти­че­ский пере­за­пуск рабо­та­ет.