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=yes
,systemctl stop mytest
则systemd
只需查看 cgroup systemd/system.slice/mytest.service
,并且由于其中没有进程,它只是认为“它似乎已经停止,所以......那里无事可做!”