systemd サービスがフォークを処理したい。 (私のファイル自体はフォークを処理しません。だからそれを処理するために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
私が達成したい目的には十分な仕様がありますか?それとも、私のサービスがフォーク/デーモンを処理するという事実をupstartに実際に知らせるupstartでフォークを期待するのと似ていますか(正しく理解しているかどうかわからない場合は、initスクリプトの作成が初めてです)。
答え1
systemdには素晴らしいドキュメントがあります。ページを見るサービスファイル:
ブランチに設定されている場合、ExecStart =で設定されたプロセスは開始の一部としてブランチ()を呼び出す必要があります。起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続きデフォルトデーモンとして実行されます。これは従来のUNIXデーモンの動作です。この設定を使用する場合は、systemdがデーモンのデフォルトプロセスを識別できるように、PIDFile =オプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。
したがって、これを使用すると、systemdに戻りをtype
待ってから、まだ実行中だと思います。これを実装することは依然としてあなたの責任です...swamp
答え2
systemdでフォークを処理するには、たとえばまたはを使用するType=simple
必要がありますType=notify
。その後、systemdはフォーク操作を実行します。
swamp
実行可能ファイルを変更できる場合は、これがType=notify
最善の解決策です。実行可能ファイルが正常に初期化されたら、systemdに通知する必要があります。これはsystemctl start swamp
、コマンドラインから呼び出されたときにswampが初期化されるのを待ち、コマンドラインを初期化するときに通常必要なエラーメッセージを出力することを意味します。
Type=notify で作成された実行可能ファイルの例については、次のシェルスクリプトを参照してください。
#!/bin/bash
sleep 3
systemd-notify READY=1
sleep 1000000