私が現在取り組んでいる会社では、レガシーサービスがあり、そのinitスクリプトは古いSysvInitを使用していますが、systemd(CentOS 7)で実行されています。
計算量が多いため、このサービスの完了には約70秒かかります。 systemdのタイムアウトを構成せず、/etc/systemd/system.conf
でデフォルトの構成を変更しませんでしたが、service SERVICE stop
を実行すると、サービスが60秒後にタイムアウトします。
journalctl -b -u SERVICE.service
で確認します。次のログが見つかります:
Sep 02 11:27:46 service.hostname systemd[1]: Stopping LSB: Start/Stop
Sep 02 11:28:46 service.hostname SERVICE[24151]: Stopping service: Error code: 255
Sep 02 11:28:46 service.hostname SERVICE[24151]: [FAILED]
/etc/systemd/system.conf
のDefaultTimeoutStopSec
プロパティを90s
に変更しようとしましたが、それでもタイムアウトが発生します。
誰かが60秒でタイムアウトする理由を誰か知っていますか?このタイムアウト値が構成されている他の場所はありますか?確認方法はありますか?
このサービスはJava 7で実行され、デーモン化するには [〜#〜] jsvc [〜#〜] を使用します。-wait
パラメータを設定しました値は120
です。
起動にも時間がかかるため、systemdサービスがタイムアウトし続けたため、これで問題が解決しました。
systemd
の最新バージョンの場合:systemctl edit --full node.service
(「ノード」をサービス名に置き換えます)。/etc/systemd/system/node.service.d/
にシステムファイルが作成され、/usr/lib/systemd/system/node.service
にあるシステムファイルが上書きされます。これは、システムファイルを構成する適切な方法です。 systemctl edit
の使用方法についての詳細は here です。/usr/lib/systemd/system/node.service
にあります。 「ノード」をアプリケーション名に置き換えます。ただし、/usr/lib/systemd/
内のファイルを直接編集するのは安全ではありません(コメントを参照)TimeoutStartSec
、TimeoutStopSec
またはTimeoutSec
(詳細情報 ここ )を使用して、プロセスの開始と停止にタイムアウトが必要な時間を指定します。その後、これは私のsystemdファイルがどのように見えるかです:
[Unit]
Description=MyProject
Documentation=man:node(1)
After=rc-local.service
[Service]
WorkingDirectory=/home/myproject/GUIServer/Server/
Environment="NODE_PATH=/usr/lib/node_modules"
ExecStart=-/usr/bin/node Index.js
Type=simple
Restart=always
KillMode=process
TimeoutSec=900
[Install]
WantedBy=multi-user.target
systemctl show node.service -p TimeoutStartUSec
systemctl show node.service -p TimeoutStopUSec
systemctl show node.service -p TimeoutUSec
次に、systemdをsystemctl reload node.service
でリロードする必要があります
systemctl start node.service
でサービスを開始してくださいsystemctl reboot
でsystemctlを再起動してみてください--no-block
オプションを次のように使用してみてください:systemctl --no-block start node.service
。このオプションについて説明します ここ :「要求された操作が完了するのを同期的に待機しません。これが指定されていない場合、ジョブが検証され、キューに入れられ、systemctlはユニットの起動が完了するまで待機しますこの引数を渡すことにより、検証とエンキューのみが行われます。 "systemctl mask
の代わりにsystemctl start
を使用するオプションもあります。詳しくは こちら をご覧ください。コメントからの更新:
TimeoutSec=infinity
:ここで「無限大」を使用する代わりに、TimeoutSec=900
(15分)のように、代わりに長い時間を置きます。アプリケーションが「永遠に」終了する場合、再起動が無期限にブロックされる可能性があります。クレジット@Alexis Wilkeおよび@JCCyC/usr/lib/systemd/system
を編集する代わりに、代わりにsystemctl edit
を試すか、/etc/systemd/system
を編集してオーバーライドしてください。 /usr/lib/
のサービスファイルは編集しないでください。クレジット@ryeagerおよび@ 0xC0000022Lランニング systemctl show SERVICE_NAME.service -p TimeoutStopUSec
systemdがサービスに設定したタイムアウトを少なくとも確認できました。
正常に動作するように、スクリプトを通常のユニットファイルに変更しました。
パッケージのアップグレード時に上書きされる/usr/lib/systemd/system/
でパッケージのサービスファイルを編集する代わりに、次を使用します。
Sudo EDITOR=/bin/vi systemctl edit <service-name>
(はい、nanoがデフォルトのエディターです!Eeugh!)
これにより、ファイル/etc/systemd/system/service-name.service.d/override.conf
が安全に編集されます。
このファイルに含める必要があるのは、次のものだけです。
[Service]
# Override default 90 second timeout in pathological conditions
TimeoutStopSec=5 # or whatever value you want
次のように入力して、全体的な効果を確認します。
systemctl cat <service-name>