systemd
フォークされたサービスに基づく起動スクリプトがあります。foo
YAJSW(別のJavaサービスラッパー)。文書の関連部分は.service
次のとおりです。
ExecStart=/opt/foo/startup.sh
ExecStop=/opt/foo/shutdown.sh
Restart=always
Type=forking
PIDFile=/opt/foo/wrapper.pid
このstartup.sh
スクリプトはYAJSWラッパーの起動を担当します。起動時に対応するPIDがファイルに書き込まれるようにYAJSW設定ファイルを設定します。
wrapper.pidfile = /opt/foo/wrapper.pid
これにより(何らかの理由で)ラッパープロセスが終了したら、systemdはこれを開始する必要があります。これは望ましい動作です。この設定が正しく機能していることを確認しましたが、Journalctlに奇妙な行が表示されます。
foo.service: PID file /opt/foo/wrapper.pid not readable (yet?) after start: No such file or directory
奇妙なことに、systemctl status fooはマスターPIDを正しく表示します。
foo.service
...
Main PID: 12313 (java)
私が何か間違っているのか、それともソフトウェアコンポーネントの1つのバグですか?私はUbuntu 16.04.3 LTS、カーネルバージョン4.4.0、システムバージョン229.4を実行しています。どんな助けでも大変感謝します。
答え1
フォークされたサービス[...] YAJSW(別のJavaサービスラッパー)[...]
ExecStart=/opt/foo/startup.sh
[...]ExecStop=/opt/foo/shutdown.sh
[...] PIDがファイルに書き込まれます[...]
この種のタスクはJavaでよく見られ、通常はOracleシステムでもよく見られるように見えますが、まったく必要ありません。実際のサービスマネージャで実行するためにシェルスクリプトやJavaで書かれたPoor Man Service Managerは必要ありません。 PIDファイルは完全に危険で不安定なメカニズムです。startup.sh
スクリプトは不要で、shutdown.sh
最終的には良い結果なしにプロセスツリーの上に実際のサービスプロセスをプッシュします。追加の YAJSW 構成ファイルは必要ありません。メモリの標準出力バッファリングに基づく複雑で特別なロギングメカニズムは必要ありません。
あなたのサービスプロセスは実際のサービス管理によって直接管理されなければならず、ほとんど何もないので、システム化されたフォーク準備プロトコルを使用しません。実際にそれを書いてください。 Poor Man's Service Managerを実行するためにラッパーシェルスクリプトを使用しないでください。 PIDファイルを使用しないでください。すべてのシェルスクリプトラッパーはフォークではなくチェーンロードする必要があります。構成ファイルは、一部ではなくシステム・サービス単位ファイルです。その他構成ファイル。ロギングメカニズムは、標準出力と標準エラーをキャプチャし、そのデータをファイルに書き込むサービス管理に付属するメカニズムです。
追加読書
- ジョナサンデボインポラード(2015)。無意味な追加レイヤーでApache Tomcatをラップする 体系化された恐怖の家。
- ジョナサンデボインポラード(2015)。 システム化された恐怖の家。よく与えられる答えです。
- /usr/bin/envがシステムログに実行可能ファイルとして表示されるのを防ぐ方法
- systemdを使用したJavaデーモンの構成
- https://unix.stackexchange.com/a/434726/5132
- ジョナサンデボインポラード(2016)。今世紀にはまたはを使用しないでください
logrotate
。newsyslog
。よく与えられる答えです。
答え2
私はこれがバグではなく複雑さの問題だと言いたいです。現在、アプリケーションを起動して管理するためのチェーンがあります。
systemd -> startup.sh -> YAJSW -> actual app
私はstart.shとYAJSWが正確に何をしているのかわかりませんが、管理を簡素化する方が良いでしょう。
systemd -> actual app
だから管理に問題があればたくさん何が起こったのかを推測する方が簡単です。
管理ツールの使用を最大化systemd
し、スクリプトとYAJSWが実行する作業を最小限に抑えるか削除することで、状況を簡素化することをお勧めします。