У меня есть сценарий systemd:
[Unit]
After=syslog.target
Requires=mysql.service
OnFailure=-/bin/bash -lc 'source /home/ubuntu/.profile && ./script/my_script_for_failure.sh'
[Service]
WorkingDirectory=/home/ubuntu/my_app
ExecStart=/bin/bash -lc 'source /home/ubuntu/.profile && ./script/my_main_script.sh'
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=my_service123
User=ubuntu
Group=ubuntu
[Install]
WantedBy=multi-user.target
Его "статус" показывает мне это в замаскированном виде:
$ sudo systemctl status my_systemd.service
● my_systemd.service
Loaded: loaded (/etc/systemd/system/my_systemd.service; disabled; vendor preset: enabled)
Active: active (running) since
Main PID: 23660 (bash)
Tasks: 5
Memory: 185.4M
CPU: 6.752s
CGroup: /system.slice/my_systemd.service
├─23660 /bin/bash -lc source /home/ubuntu/.profile && ./script/my_main_script.sh
├─23662 /bin/bash ./script/my_main_script.sh
└─23663 /home/ubuntu/.gem/ruby/2.3.4/bin/rake jobs:work
Мой вопрос:
как я могу протестировать или вызвать "OnFailure"? Единственный способ убить все 3 процесса командой «kill -9»?
Если да, то какой из 3 я должен убить?
Или один из них?
Я пытался убить "23663", но "my_script_for_failure" не сработал.
sudo systemctl status my_systemd.service
не будет работать, потому что нет "ExecStop", потому что "rake jobs: work" не имеет стандартного способа завершения.
OnFailure = срабатывает, когда для устройства достигается состояние «сбой», и когда больше не остается попыток перезапуска для службы (т.е. либо Restart = отключен, либо достигнут предел скорости, либо понимается как: следующий суб состояние не будет автоматически перезапускаться).
systemd контролирует основной PID службы и связывает с ним изменения состояния. Таким образом, если он умирает нечисто (выходит сам по себе с кодом выхода, который не должен интерпретироваться как успех) или убит, состояние ошибки будет достигнуто.
Таким образом, отключение PID 23660 должно запускать устройство, зарегистрированное в OnFailure = ПОСЛЕ того, как все попытки перезапуска закончились (из-за ограничения скорости). До тех пор устройство не сработает. Может случиться так, что вы никогда не попадаете в значения по умолчанию StartLimitIntervalSec = и StartLimitBurst =, и unit продолжает перезапускаться при сбое и никогда не прекращает это делать: в этом случае вам следует настроить их на подходящее значение.