web-dev-qa-db-ja.com

`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
4
Stephen Kitt

基本的に、systemdはcgroupを介して開始するすべてのプロセスを追跡します。RemainAfterExit=yesを指定しない限り、状態情報は維持されません。 cgroupにプロセスが残っていません。」

RemainAfterExit=yesがない場合、systemctl stop mytestsystemdsystemd/system.slice/mytest.service cgroupを確認させるだけです。それにはプロセスがないため、「すでにあるようです停止したので...そこで何もする必要はありません!」

0
telcoM