如果未定义“stop/restart/reload”,如何导致 systemd 服务出现“OnFailure”?

如果未定义“stop/restart/reload”,如何导致 systemd 服务出现“OnFailure”?

我有一个 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”?唯一的方法是通过“kill -9”杀死所有 3 个进程吗?

如果是的话我应该杀死这三个中的哪一个?

或者其中之一?

我尝试终止“23663”,但“my_script_for_failure”并未被触发。

sudo systemctl status my_systemd.service无法工作,因为没有“ExecStop”,因为“rake jobs:work”没有标准的终止方式。

答案1

当单元达到“失败”状态,并且不再有服务重启尝试时(即,Restart= 被禁用,或者已达到速率限制,或理解为:下一个子状态不会自动重启),会触发 OnFailure=。

systemd 负责监控服务的主 PID,并将状态变化与其关联。因此,如果服务非正常终止(自行退出,退出代码不代表成功)或被终止,则将达到失败状态。

因此,在所有重启尝试结束之后(由于速率限制),终止 PID 23660 应该会触发在 OnFailure= 中注册的单元。在此之前,该单元不会被触发。可能是您从未达到默认的 StartLimitIntervalSec= 和 StartLimitBurst= 值,并且单元在失败时不断重启,并且永远不会停止这样做:在这种情况下,您应该将它们调整为合适的值。

相关内容