私のワークステーションで継続的に実行されているライセンスサーバーを制御するためにsystemdを使用しようとしています。サービス自体はデフォルトでシェルスクリプトによって開始されます。
Usage: ./rlm_control.sh {start|stop|restart|status}
これから私はシステムサービスファイルを作成しました。
[Unit]
Description=RLM License Server
After=network.target
[Service]
Type=forking
ExecStart=/path/to/rlm_control.sh start
ExecStop=/path/to/rlm_control.sh stop
ExecReload=/path/to/rlm_control.sh restart
User=chris
Restart=on-failure
[Install]
WantedBy=multi-user.target
問題は、この制御スクリプトが実際に別のプロセスを分岐し、独自のログを持っていることですrlm
。ログはrlm_control.sh
ジャーナルドにありますが、ログはrlm
見つかりません。
tail -f /path/to/rlm.log
デフォルトでは、そのサービスのログに出力を追加するようにジャーナルドに指示することは可能ですか?
編集:この質問は以前[0]で要求されていましたが、解決策は他のログファイルから読み取るようにサービスファイルを調整するのではなく、コマンドを使用してログを追加することを提案しているようです。
答え1
ここでの問題は、コメントですでに述べた内容です。システムユニットを作成するのではなく、「システムプロセスジェネレータ」を作成します。ファイルをログにリンクするのではなく、サービスを完全に提供することについて話しているので、ソフトウェアログをジャーナルに送信する前に解決する必要があるいくつかの問題があります。
- 実際のシステムデバイスには同様のものがあり、デーモンを起動した親プロセスを呼び出して終了するスクリプトを
ExecStart=/path/to/license_software_bin -d parameter1 -f parameter2 -c -whatever
呼び出さないでください。Type=forking
fork()
- 構成により、
PIDFile=/run/path/to/pidfile.pid
プロセス識別が向上します。引用するsystemd.service
マンページ:
PIDFile=
サービスPIDファイルのパスを使用します。
Type=
に設定されているサービスにこのオプションを使用することをお勧めしますforking
。指定されたパスは通常、次のいずれかのファイルを指します/run/
。相対パスを指定する場合は、接頭辞を付ける必要があります/run/
。PID
サービスの開始後、サービス管理者はこのファイルからサービス基本プロセスを読み取ります。サービスマネージャはここで設定されたファイルに書き込みませんが、サービスが終了してもファイルが残っている場合は削除します。 PIDファイルは、権限のあるユーザーが所有する必要はなく、権限のないユーザーが所有している場合は、追加のセキュリティ制限を実装する必要があります。ファイルは、所有しているファイルへのシンボリックリンク(直接または間接的)にすることはできません。他のユーザーのPIDファイルとすでにそのサービスに属するプロセスを参照する必要があります。
そして:
に設定すると、構成された
forking
プロセスが開始の一部として呼び出されるExecStart=
と予想されます。fork()
起動が完了し、すべての通信チャネルが確立されると、親プロセスが終了すると予想されます。子プロセスは引き続き基本サービスプロセスとして実行され、親プロセスが終了すると、サービスマネージャはそのユニットが開始されたと見なす。これは既存のUNIXサービスの動作です。この設定を使用する場合は、PIDFile=
systemdがサービスの基本プロセスを確実に識別できるように、このオプションも使用することをお勧めします。親プロセスが終了すると、systemd は引き続き後続のユニットを起動します。
httpd.service
CentOS 7のシステムデバイス設計の単純さを見てください。バイナリを直接呼び出すので、プロセスを終了して停止する時間を与え、Apache自体に固有のものを使用して再ロードするExecStart=
必要はありません。PIDFile=
SIGCONT
TimeoutStopSec
httpd -k graceful
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target