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
の指定は、私が達成しようとしていることに対して十分ですか?または、サービスがフォーク/デーモン化を処理することを実際にアップスタートに通知するアップスタートでフォークを期待するのと似ていますか(私が正しく理解していれば、確信がありません。
systemdには優れたドキュメントがあります。 service files のページを参照してください。
Forkに設定されている場合、ExecStart =で構成されたプロセスは、起動の一部としてfork()を呼び出すことが期待されます。親プロセスは、起動が完了し、すべての通信チャネルが設定されると終了することが期待されています。子はメインデーモンプロセスとして実行を続けます。これは、従来のUNIXデーモンの動作です。この設定を使用する場合は、systemdがデーモンのメインプロセスを識別できるように、PIDFile =オプションも使用することをお勧めします。 systemdは、親プロセスが終了するとすぐに、フォローアップユニットの開始に進みます。
そのため、そのtype
を使用すると、systemdにswamp
が戻るまで待機し、それがまだ実行中であると見なすよう指示するだけです。
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