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
什么都不做。
为什么?请详细说明。
这在systemd 服务文档中有详细说明,但是您几乎需要阅读所有内容才能了解发生了什么。在这种情况下,最相关的部分是示例 3;从中,读者可以收集到您声明的 oneshot 服务永远不会激活,因此它的停止操作将在其启动操作完成后运行。
为了实现您所追求的目标,您需要一个仍处于活动状态的 oneshot 服务:
基本上,
systemd
跟踪它通过 cgroups 启动的所有进程,除非您指定RemainAfterExit=yes
,否则它不会维护状态信息“是的,mytest.service 已运行并且应该被认为仍然启用,尽管它的 cgroup 中没有剩余进程。”没有
RemainAfterExit=yes
,只是看一下cgroup,因为里面没有进程,systemctl stop mytest
它只是认为“它似乎已经停止了,所以......没什么可做的!”systemd
systemd/system.slice/mytest.service