我有一个应用程序,它完成后正常退出不应该重新启动.在此应用程序完成其业务之后,我想关闭实例(ec2).我正在考虑使用带有选项的systemd单元文件来执行此操作
Restart=on-failure
ExecStopPost=/path/to/script.sh
Run Code Online (Sandbox Code Playgroud)
应该运行的脚本ExecStopPost:
#!/usr/bin/env bash
# sleep 1; adding sleep didn't help
# this always comes out deactivating
service_status=$(systemctl is-failed app-importer)
# could also do the other way round and check for failed
if [ $service_status = "inactive" ]
then
echo "Service exited normally: $service_status . Shutting down..."
#shutdown -t 5
else
echo "Service did not exit normally - $service_status"
fi
exit 0
Run Code Online (Sandbox Code Playgroud)
问题是,当后停止运行时,我似乎无法检测服务是否正常结束,然后状态是deactivating,只有在我知道它是否进入failed状态之后.
您的问题是 systemd 认为该服务在deactivating该ExecPostStop过程完成之前一直存在。入睡无济于事,因为它只会等待更长时间。an 的想法ExecPostStop是清理服务可能留下的任何东西,如临时文件、UNIX 套接字等。服务尚未完成,准备重新启动,直到清理完成。所以如果你这样看,systemd 所做的确实是有道理的。
你应该做的是检查$SERVICE_RESULT,$EXIT_CODE和/或$EXIT_STATUS在你的脚本,它会告诉你如何服务停止。例子:
#!/bin/sh
echo running exec post script | logger
systemctl is-failed foobar.service | logger
echo $SERVICE_RESULT, $EXIT_CODE and $EXIT_STATUS | logger
Run Code Online (Sandbox Code Playgroud)
当允许服务运行完成时:
Sep 17 05:58:14 systemd[1]: Started foobar.
Sep 17 05:58:17 root[1663]: foobar service will now exit
Sep 17 05:58:17 root[1669]: running exec post script
Sep 17 05:58:17 root[1671]: deactivating
Sep 17 05:58:17 root[1673]: success, exited and 0
Run Code Online (Sandbox Code Playgroud)
当服务在完成之前停止时:
Sep 17 05:57:22 systemd[1]: Started foobar.
Sep 17 05:57:24 systemd[1]: Stopping foobar...
Sep 17 05:57:24 root[1643]: running exec post script
Sep 17 05:57:24 root[1645]: deactivating
Sep 17 05:57:24 root[1647]: success, killed and TERM
Sep 17 05:57:24 systemd[1]: Stopped foobar.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
900 次 |
| 最近记录: |