为什么“systemctl stop service”无法调用服务?

为什么“systemctl stop service”无法调用服务?
vim /home/mytest.sh
rm -f /home/mytest/*

我想编写一个服务来执行删除操作。
我的期望:
sudo systemctl stop mytest可以删除 /home/mytest 中的文件,
sudo systemctl start mytest什么也不做。

编辑我的服务文件。

sudo vim /etc/systemd/system/mytest.service
[Unit]
Description=delete file

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /home/mytest.sh

[Install]
WantedBy=multi-user.target

启用它。

sudo systemctl enable mytest

现在我发现 mytest 服务有一个奇怪的动作。

sudo systemctl start mytest可以删除 /home/mytest 中的文件,
sudo systemctl stop mytest什么也不做。

为什么?请详细解释一下。

答案1

这在中详细解释了systemd 服务文档,但您几乎需要阅读所有内容才能了解发生了什么。本例中最相关的部分是示例 3;由此,读者可以了解到您声明的一次性服务永远不会变为活动状态,因此一旦其启动操作完成,其停止操作就会运行。

为了实现您的目标,您需要一个一次性服务,该服务仍然处于活动状态:

[Unit]
Description=delete file

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/bin/bash /home/mytest.sh

[Install]
WantedBy=multi-user.target

答案2

基本上,systemd跟踪它通过 cgroup 启动的所有进程,除非您指定RemainAfterExit=yes,否则它不会维护状态信息“是的,mytest.service 已运行,并且应被视为仍然启用,尽管其 cgroup 中没有剩余进程。”

如果没有RemainAfterExit=yessystemctl stop mytestsystemd只需查看 cgroup systemd/system.slice/mytest.service,并且由于其中没有进程,它只是认为“它似乎已经停止,所以......那里无事可做!”

相关内容