web-dev-qa-db-ja.com

SystemdスクリプトはExecStartの直後にExecStopを実行します

これが私のSystemdスクリプトです:

[Unit]
Description=RDS Services

[Service]
WorkingDirectory=/home/rdsdb2/script_rds/
Type=oneshot
ExecStart=/bin/bash start_services.sh
ExecStop=/bin/bash stop_services.sh
KillMode=process

[Install]
WantedBy=multi-user.target

なぜそれが順番に実行されるのか(システムの起動時または手動で起動したとき)ExecStartとExecStopがわかりません。

手伝って頂けますか?

前もって感謝します。

15
S4rg0n

Type = oneshotは、ファイルシステムのチェックやクリーンアップなど、アクティブなプロセスを維持せずにアクションを実行するユニットに使用されます。このようなsystemdユニットは、ExecStartで指定されたプロセスが終了するまで停止し、ExecStopで指定されたプロセスを実行して非アクティブ化します。

Type = simple(デフォルト設定)は、ExecStartで構成されたプロセスがサービスのメインプロセスである場合に使用されます。このようなユニットは、ExecStartで指定されたプロセスが戻るまで待機し、ExecStopで指定されたプロセスを実行して非アクティブ化します。

RemainAfterExit = yesの場合、すべてのプロセスが戻った場合でもサービスはアクティブであると見なされるため、ExecStopで指定されたプロセスは自動的に実行されません。ただし、サービスがクラッシュした場合でもサービスはアクティブであるように見えるため、この設定はお勧めしません。この設定はデフォルトで無効になっています。

Type = forkingは、ExecStartで指定されたプロセスが起動の完了後に終了し、その子プロセスが実行を継続する場合に使用されます。背景。これは、従来のUNIXデーモンの動作であり、この場合に推奨される選択です。 ExecStop設定はオプションであり、クリーンターミネーションのためにサービスと通信するために使用されます。 ExecStopで指定されたプロセスは、サービスがクラッシュした場合に実行されます。 ExecStopオプションがない場合、systemctl stop servicenameコマンドは、指定されたとおり、ユニットの残りのプロセスを単に強制終了します。 KillModeオプションによる。

24
Christophe

あなたが実行した場合

[Service]
Type=simple

必要以上に:RemainAfterExit = yes

またはフォークを使用する:

[Service]
Type=forking
8
xsor

追加するだけです:RemainAfterExit = yesそれは魅力のように機能します

1
sylvek