Systemd 终止了我的 vetcore 服务:“已成功停用”

Systemd 终止了我的 vetcore 服务:“已成功停用”

因此,我在 Linux 上为我的 netcore bash 脚本创建了一个 systemd 文件。但是当我启动服务文件时,systemd继续杀死它,结果是“服务:已成功停用”。

我尝试插入Type=forkingorType=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以使服务文件更改生效。

相关内容