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です。それから、リーダーは、あなたがそれが決してアクティブにならないと宣言したときのワンショットサービスを集めることができるので、その開始アクションが完了すると、その停止アクションが実行されます。
目的を達成するには、アクティブになるワンショットサービスが必要です。
[Unit]
Description=delete file
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStop=/bin/bash /home/mytest.sh
[Install]
WantedBy=multi-user.target
基本的に、systemd
はcgroupを介して開始するすべてのプロセスを追跡します。RemainAfterExit=yes
を指定しない限り、状態情報は維持されません。 cgroupにプロセスが残っていません。」
RemainAfterExit=yes
がない場合、systemctl stop mytest
はsystemd
にsystemd/system.slice/mytest.service
cgroupを確認させるだけです。それにはプロセスがないため、「すでにあるようです停止したので...そこで何もする必要はありません!」