LINUX.ORG.RU

systemd: on-failure нужно процесс добить, затем restart

 , ,


0

1

Привет, лор!

Пишу юнит с задачей автоматического перезапуска сервиса при завершении с кодом Main process exited, code=exited, status=1/FAILURE. Если просто делать перезапуск сервиса через 5 сек, то используемый им же порт оказывается недоступен. Нужно добить процесс для освобождения порта, затем перезапустить. RemainAfterExit, KillMode, SendSIGKILL – не могу понять, что ему нужно.

Спасибо.

★★

поиграться с
ExecStop=
ExecStopPost=
не помню конечно как они отрабатываются при файлуриках.

pfg ★★★★★ ()
Последнее исправление: pfg (всего исправлений: 1)

Если просто делать перезапуск сервиса через 5 сек, то используемый им же порт оказывается недоступен.

Похоже, что у тебя неправильно определяется само завершение.

anonymous ()

Текст юнита и логи перезапуска в студию.

Вообще, начни с KillMode=control-group:

[Service]
<...>
KillMode=control-group

Если не получится — то можно на ExecStopPost= накостылить, но мне хотелось бы увидеть, что же это за ситуация такая.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Привет! Спасибо, что заглянул.

Живу в условиях постоянно обрывающегося, но оч. медленного нэта: неск. кБ/с, поэтому у меня доступ в сеть как у космонавтов на МКС – с предзагрузкой на сервере и дальнейшей синхронизацией по syncthing. Последняя спасает меня от нервозов – спасибо форумчанам, которые мне подсказали её юзать.

Для предзагрузки откопал умирающий проект HTTrack (в век высокоскоростного интернета такое никому не нужно, да). Почему его – потому что он умеет в куки. Он загружает один список ссылок за сессию, параллельной работы не предусмотрено. Завершается с какой-то ошибкой, я так и не разобрался в чём там дело, уже слишком много времени на такую ерунду потратил. Короче, если скомандовать systemctl stop, а затем systemctl start – HTTrack снова в строю. Иначе (restart) он пишет в лог нехорошие слова про занятый порт. Убить бы его.

control-group на моей vps-ке не работают, как я понимаю, потому что ядро реликтовое – 2.6.

Юнит такой:

[Unit]
Description=HTTrack web-server for 'vps'
After=network.target

[Service]
User=vps
Group=vps
Type=simple
WorkingDirectory=/home/vps/httrack
ExecStart=/usr/lib/httrack/htsserver /usr/share/httrack/ --path /home/vps/httrack --language 8 --port 2340
RemainAfterExit=no
KillMode=process
SendSIGKILL=yes
RestartSec=10
Restart=on-failure

[Install]
WantedBy=multi-user.target

Лог завершения сессии и перезапуска такой:

Nov 08 16:13:34 vpshost htsserver[1237]: Unable to create the server: No such file or directory
Nov 08 16:13:34 vpshost htsserver[1237]: Done
Nov 08 16:13:34 vpshost htsserver[1237]: EXITED
Nov 08 16:13:34 vpshost systemd[1]: httrack-vps.service: Main process exited, code=exited, status=1/FAILURE
Nov 08 16:13:34 vpshost systemd[1]: httrack-vps.service: Unit entered failed state.
Nov 08 16:13:34 vpshost systemd[1]: httrack-vps.service: Failed with result 'exit-code'.
Nov 08 16:13:44 vpshost systemd[1]: httrack-vps.service: Service hold-off time over, scheduling restart.
Nov 08 16:13:44 vpshost systemd[1]: Stopped HTTrack web-server for 'vps'.
-- Subject: Unit httrack-vps.service has finished shutting down
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit httrack-vps.service has finished shutting down.
Nov 08 16:13:44 vpshost systemd[1]: httrack-vps.service: Failed to set invocation ID on control group /system.slice/httrack-vps.service, ignoring: Operation not permitted
Nov 08 16:13:44 vpshost systemd[1]: Started HTTrack web-server for 'vps'.
-- Subject: Unit httrack-vps.service has finished start-up
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- Unit httrack-vps.service has finished starting up.
--
-- The start-up result is done.
Nov 08 16:13:44 vpshost systemd[1]: Started HTTrack web-server for 'vps'.
Nov 08 16:13:44 vpshost htsserver[2557]: Unable to initialize a temporary server (no remaining port)
Nov 08 16:13:44 vpshost htsserver[2557]: Initialzing the server..
Nov 08 16:13:44 vpshost htsserver[2557]: EXITED
rmu ★★ ()
Ответ на: комментарий от rmu

control-group на моей vps-ке не работают, как я понимаю, потому что ядро реликтовое – 2.6.

2.6? Блин, а чего ты тогда вообще хочешь?

Минимальные требования systemd к ядру — 3.13, рекомендуемые — 4.2 (для поддержки cgroups v2, и ты её хочешь — cgroups v1 глючные и эта глючность передаётся systemd).

Думаю, здесь нет хорошего решения. Попробуй накостылить что-нибудь на ExecStopPost=, да хотя бы killall httrack (так вообще очень-очень не рекомендуется делать, потому что это убивает всю идею изоляции и независимости юнитов друг от друга, но, кажется, у тебя нет выбора).

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

По разному пробовал завершать – ничего не помогает. Процесс умирает без вопросов, но дело не в ExecStopPost, а в том, что от убитого приложения остаётся незакрытый порт. ss, fuser -k – pid завершают, но порт всё равно остаётся подвешенным.

Если руками набрать systemctl stop + systemctl start, то порты освобождаются, приложение тут же стартует без ошибок. Почему restart так не может?

rmu ★★ ()
Ответ на: комментарий от rmu

от убитого приложения остаётся незакрытый порт

Звучит как какая-то дичь.

Если руками набрать systemctl stop + systemctl start, то порты освобождаются, приложение тут же стартует без ошибок. Почему restart так не может?

Звучит как какая-то дичь[2]. В systemd restart бай дизайн эквивалентен stop+start (собственно, именно поэтому там нет ExecRestart=). Ни малейшего понятия, почему так вообще происходит.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Решил вопрос: в итоге два юнита и bash лупер.
Первый юнит поднимает сервер от непривилегированного юзера:

[Unit]
Description=HTTrack web-server for 'vps'
After=network.target

[Service]
User=vps
Group=vps
Type=simple
ExecStart=/usr/lib/httrack/htsserver /usr/share/httrack/ --path /home/vps/httrack --language 8 --port 2340

[Install]
WantedBy=multi-user.target

Второй – контролёр первого:

[Unit]
Description=HTTrack bicycle
After=network.target

[Service]
Type=simple
ExecStart=/etc/httrack.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

И луп (добивает, пока паучок не запустится с сокетом):

#!/bin/sh

while true
do
    if [ -z "$(netstat -tulpn | grep 2340)" ]
    then
        systemctl restart httrack-trans.service
    fi
    sleep 10
done

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

Жалко, проект уже умирает. Так и не придумал, как по человечески закрыть вот эту дырку:

strace -f -e open ls 2>&1 | grep ^open
open("/usr/share/httrack/html/ping", O_RDONLY) = -1 ENOENT (No such file or directory)

А без интернета прям пичалька. Утешает то, что лор работает как часы – можно пользоваться напрямую, без предзагрузки.

Благодарю за обсуждение и советы.

rmu ★★ ()
14 октября 2020 г.

Ты разобрался почему у тебя падает демон? Если нет, начни именно с этого.

LongLiveUbuntu ★★★★★ ()
Ответ на: комментарий от superuser
-[про системд]
-НужноПисать=Кровью
anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.