次の種類のシステムサービスファイルがあります。
[Unit]
Description=Mount some special file systems
After=local-fs.target
Before=syslog.service
[Service]
Type=oneshot
ExecStart=/root/some-complicated-mounts.sh
ExecStop=/root/some-complicated-umounts.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
このスクリプトは/root/some-complicated-mounts.sh
いくつかのファイルシステムをマウントします。
そのステートメントを追加するまで、サービスは正しく機能しませんでしたRemainAfterExit=yes
。この文がなければ、ログによると、スクリプトが正常に実行されたとしても、スクリプトで完了したインストールが消えたように見えます。
RemainAfterExit=yes
その宣言が必要な理由と、システム文書でこの動作が説明されている場所を知りたいです。
ベストアンサー1
この単一のサービスは、これがなければ機能しません。RemainAfterExit=yes
なぜなら、systemdはスクリプトが完了するとすぐにデバイスが無効になると考えていsome-complicated-mounts.sh
ますExecStop=
。some-complicated-umounts.sh
スクリプト。
を使用すると、RemainAfterExit=yes
コマンドの完了後にデバイスが起動したと見なされ、問題が解決しますExecStart=
。活動的に過ごす。したがって、コマンドは、ExecStop=
デバイスが明示的に停止した場合(systemctl stop
コマンドを使用)、または通常のシャットダウンプロセスの一部として(すべてのデバイスが停止した場合)にのみ実行されます。
文書化に関しては、systemd文書には実際にこのような状況の例があります。「例 3. 停止可能なワンタイムサービス」systemd.service(5) のマニュアルページ。ユースケースの例は次のとおりです。
ワンタイムサービスと同様に、プログラムを実行して何かを設定し、他のプログラムを実行してシャットダウンする必要があるデバイスがありますが、「起動」と見なされるとプロセスがアクティブになっていないデバイスがあります。 [...]
このために、systemdは設定を知っており、
RemainAfterExit=yes
実行ジョブが正常に終了すると、systemdはデバイスがアクティブであると見なします。
また実施例2、いいえですExecStop=
。
(残念ながら、RemainAfterExit=
それ自体はあまりにも簡潔であり、実際に詳細をカバーしていません。このオプションのドキュメントを改善する機会があるかもしれません。 )