systemdスクリプトのフォーク


10

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

回答:


16

systemdには優れたドキュメントがあります。サービスファイルのページを参照してください。

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

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


5
スクリプトがforkを行わない場合、それはoneshot(典型的な短い実行スクリプト)またはsimple(fork + exitしない長期実行サービス)のいずれかです。
PavelŠimerda2014

4
アンパサンドを使用してバックグラウンドで実行しているときに別のプロセスをフォークするスクリプト(Bash?)を検討します&か?
フェリペアルバレス

5
@FelipeAlvarezはい、bashのアンパサンド演算子はforkおよびexecと同等です。
Thayne

1

systemdでforkを処理したい場合は、eg 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.