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
これについて詳しく説明します。システムサービス文書しかし、何が起こっているのかを理解するには、ほとんどすべての内容を読む必要があります。この例の中で最も関連性の高い部分は実施例3である。宣言した 1 回限りのサービスは決してアクティブ化されないため、開始ジョブが完了すると停止ジョブが実行されることを読者は理解できます。
目標を達成するには、まだアクティブなワンタイムサービスが必要です。
[Unit]
Description=delete file
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/bin/bash /home/mytest.sh
[Install]
WantedBy=multi-user.target
答え2
systemd
デフォルトでは、cgroupを介して開始されたすべてのプロセスを追跡し、 「はい、mytest.serviceが実行されており、RemainAfterExit=yes
そのcgroupに残っているプロセスがない場合でもまだアクティブであると見なされる必要があります」を指定しない限り、ステータス情報は保持されません。
RemainAfterExit=yes
そうでなければcgroupだけ見てプロセスがないので、ただ「停止されたようだから…そこにはやるべきことがない!」と思いますsystemctl stop mytest
。systemd
systemd/system.slice/mytest.service