我有一个 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= 值,并且单元在失败时不断重启,并且永远不会停止这样做:在这种情况下,您应该将它们调整为合适的值。