因此,我在 Linux 上为我的 netcore bash 脚本创建了一个 systemd 文件。但是当我启动服务文件时,systemd
继续杀死它,结果是“服务:已成功停用”。
我尝试插入Type=forking
orType=oneshot
但都不起作用。我应该怎么办?
这是服务文件:
[Unit]
Description=Example .NET Web API App running on Ubuntu
[Service]
Type=oneshot
ExecStart=/usr/bin/updatem
User=root
[Install]
WantedBy=multi-user.target
这是结果:
10:57 AM kill UpdateM
10:57 AM starting UpdateM
10:57 AM 3
10:57 AM 2
10:57 AM 1
10:57 AM UpdateM (v.1.0.0.12)
10:57 AM UpdateM (v.1.0.0.12) UP.
10:57 AM Start
10:57 AM updatem.service: Deactivated successfully.
10:57 AM Finished Example .NET Web API App running on Ubuntu.
答案1
使用 时Type=oneshot
,您通常还需要RemainAfterExit=yes
,以便 systemd 在该ExecStart=
行调用的进程结束后将服务视为“正在运行”。
从man systemd.service
关于Type=oneshot
:
请注意,如果在没有服务的情况下使用此选项,
RemainAfterExit=
则该服务将永远不会进入“活动”单元状态,而是会直接从“激活”转换为“停用”或“死亡”,因为没有配置应连续运行的进程。特别是,这意味着在这种类型的服务运行(并且尚未RemainAfterExit=
设置)之后,它将不会显示为随后启动,而是显示为死亡。
因此,您看到的行为与Type=oneshot
+ no 的预期完全一致RemainAfterExit=yes
。
如果您的/usr/bin/updatem
脚本实际上创建了一个应该继续运行的子进程,那么Type=forking
服务类型的选择就是正确的。
但是,如果/usr/bin/updatem
脚本仅向其他已经存在的进程发送命令,则会导致它要开始其他事情,并且一旦发送命令,脚本及其所有直接后代就会消失,那么Type=oneshot
,可能是RemainAfterExit=yes
,将是正确的选择。
然后,如果需要,您还可以添加一行ExecStop=
指向另一个脚本,该脚本将发送另一个命令来停止该脚本启动的操作。/usr/bin/updatem
这也将systemctl stop UpdateM.service
成为一项有意义的操作,并且它将使 systemd 在系统关闭时更优雅地停止你的事情(如果它仍在运行)。
如果您修改服务文件而不使用systemctl edit
,请记住您需要运行systemctl daemon-reload
以使服务文件更改生效。