web-dev-qa-db-ja.com

systemdスクリプトでフォークする

Systemdサービスでforkを処理したい(私のファイルはそれ自体ではforkを処理しないので、systemdに依存して処理しています)

私の.serviceファイル:

[Unit]
Description=swamp services management service
After=syslog.target

[Service]
Type=forking
ExecStart=/usr/bin/swamp

[Install]
WantedBy=multi-user.target

質問

Type=forkingの指定は、私が達成しようとしていることに対して十分ですか?または、サービスがフォーク/デーモン化を処理することを実際にアップスタートに通知するアップスタートでフォークを期待するのと似ていますか(私が正しく理解していれば、確信がありません。

10
alonisser

systemdには優れたドキュメントがあります。 service files のページを参照してください。

Forkに設定されている場合、ExecStart =で構成されたプロセスは、起動の一部としてfork()を呼び出すことが期待されます。親プロセスは、起動が完了し、すべての通信チャネルが設定されると終了することが期待されています。子はメインデーモンプロセスとして実行を続けます。これは、従来のUNIXデーモンの動作です。この設定を使用する場合は、systemdがデーモンのメインプロセスを識別できるように、PIDFile =オプションも使用することをお勧めします。 systemdは、親プロセスが終了するとすぐに、フォローアップユニットの開始に進みます。

そのため、そのtypeを使用すると、systemdにswampが戻るまで待機し、それがまだ実行中であると見なすよう指示するだけです。

16
jasonwryan

Systemdがフォークを処理するようにしたい場合は、たとえば、 Type=simpleまたはType=notify。その後、systemdがforkを行います。

swamp実行可能ファイルを変更できる場合は、Type=notifyが最適なソリューションです。実行可能ファイルは、正常に初期化されたときにsystemdに通知する必要があります。この意味は systemctl start swampは、コマンドラインから呼び出されたときにswampが初期化されるのを待機し、コマンドラインへの初期化中にエラーメッセージを出力します。これは通常必要です。

Type = notifyを使用するように記述された実行可能ファイルの例については、次のシェルスクリプトを参照してください。

#!/bin/bash                                                                     
sleep 3
systemd-notify READY=1
sleep 1000000
1
user3049102