创建一个不关心状态的“愚蠢”systemd 单元

创建一个不关心状态的“愚蠢”systemd 单元

我有一个应用程序应该在启动期间启动并在关机期间正常终止。问题是我无法确保使用 systemd 启动/停止应用程序,这是一个相当复杂的应用程序,有时可能需要使用手动命令“部分”启动,因此 systemd 没有真正的好方法来跟踪应用程序的实际状态。

因此,我得出的结论是,我需要一个“愚蠢”的 systemd 单元,无论服务状态如何,它总是在启动时运行某个脚本,在关闭时运行另一个脚本。这就是我很难完成的事情。这是我用于测试的内容:

[Unit]
Description=My Test application
Wants=network-online.target 
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/user/tmp/systemd-test/script.sh start
ExecStop=/home/user/tmp/systemd-test/script.sh stop
RemainAfterExit=true

[Install]
WantedBy=multi-user.target

上面的问题是,如果之前没有运行过 start ,我无法让它运行“停止”,反之亦然:

$ systemctl start test  # Start script is run
$ systemctl start test  # Nothing happens
$ systemctl stop test   # Stop script is run
$ systemctl stop test   # Nothing happens
$ systemctl stop test   # Nothing happens

因此,想象一下启动脚本在启动过程中由于某种原因失败,应用程序管理员进入并手动启动。那么停止脚本在关闭期间将不会运行,因为就 systemd 而言,它从未正确启动。

因此,我的问题是,有没有办法制作一个不关心状态的“愚蠢”systemd 服务,或者我必须将它分成两个不同的单元?

编辑:为了更多地解释为什么我不能真正按预期使用 systemd 状态:启动应用程序首先涉及启动一个“服务器”进程,一旦启动并运行即可启动一个“启动器”进程,该进程又会旋转约 20不同类型的加工采用不同的工艺。并且一切都是异步启动的(即非阻塞),除了 grep 日志或调用自定义二进制文件来列出进程之外,无法知道事情何时实际启动。所以 systemd 确实没有办法找出这 20 个进程之一是否启动失败。

答案1

因此,我的问题是,有没有办法制作一个不关心状态的“愚蠢”systemd 服务

你可以尝试(注意可执行文件之前的破折号):

ExecStart=-/home/user/tmp/systemd-test/script.sh start

或者

应用程序管理员进入并手动启动

您可以让他们通过 systemd 专门启动脚本,例如检查环境多变的:

test -z "$INVOCATION_ID" && echo "This script must be run via systemd" && exit

相关内容