Назад | Перейти на главную страницу

Как вызвать «OnFailure» для службы systemd? Если для него не определены «стоп / перезапуск / перезагрузка»

У меня есть сценарий 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 продолжает перезапускаться при сбое и никогда не прекращает это делать: в этом случае вам следует настроить их на подходящее значение.