systemdサービスのタイムアウト値を変更するには?


33

私が現在働いている会社では、レガシーサービスがあり、その初期化スクリプトは古い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]

既にDefaultTimeoutStopSecプロパティを/etc/systemd/system.conftoに変更しようとしました90sが、タイムアウトが発生します。

なぜ60秒でタイムアウトするのですか?このタイムアウト値が設定されている他の場所はありますか?確認する方法はありますか?

このサービスはjava 7で実行され、デーモン化するためにJSVCを使用します-wait値を使用してパラメーターを構成しました120

回答:


54

systemdサービスは、起動にも時間がかかるためにタイムアウトし続けていたので、これで修正されました。

  1. systemdファイルを編集します。
    • の最新バージョンの場合systemd:実行systemctl edit --full node.service「node」をサービス名に置き換えます))。
      • これにより、システムファイルが作成され、システムファイル/etc/systemd/system/node.service.d/が上書きされ/usr/lib/systemd/system/node.serviceます。これは、システムファイルを構成する適切な方法です。使用方法の詳細についてsystemctl editは、こちらをご覧ください
    • システムファイルの直接編集:私のシステムファイルはにあり/usr/lib/systemd/system/node.serviceます。「node」をアプリケーション名に置き換えます。ただし、ファイルを直接編集することは安全ではありません/usr/lib/systemd/(コメントを参照)
  2. または(詳細はこちら)を使用してTimeoutStartSec、プロセスを開始および停止するためのタイムアウト時間を指定します。その後、これは私のsystemdファイルの見た目です:TimeoutStopSecTimeoutSec

    [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
    
    • これらのいずれかを実行して、現在のタイムアウトステータスを表示することもできます(ただし、変更するにはサービスを編集する必要があります!ステップ1を参照してください)。
      • systemctl show node.service -p TimeoutStartSec
      • systemctl show node.service -p TimeoutStopSec
      • systemctl show node.service -p TimeoutSec
  3. 次に、systemdをリロードする必要があります systemctl reload node.service
  4. 今からあなたのサービスを開始してみてください systemctl start node.service
  5. それでもうまくいかない場合は、systemctlを再起動してみてください。systemctl reboot
  6. それがうまくいかない場合は--no-block、次のようにsystemctl のオプションを使用してみてくださいsystemctl --no-block start node.service。このオプションの説明次のとおりです。「要求された操作が終了するまで同期的に待機しないでください。これが指定されていない場合、ジョブは検証され、キューに登録され、systemctlはユニットの起動が完了するまで待機します。この引数を渡すことで、検証およびエンキューされるだけです。」
    • systemctl mask代わりに使用するオプションもありますsystemctl start。詳細はこちらをご覧ください

コメントからの更新:

  • TimeoutSec=infinity:ここで「無限」を使用する代わりに、代わりにTimeoutSec=900(15分)のように長い時間を置きます。アプリケーションの終了に「永久に」かかる場合、再起動が無期限にブロックされる可能性があります。クレジット@Alexis Wilkeおよび@JCCyC
  • 編集する代わりに/usr/lib/systemd/systemsystemctl edit代わりに試すか、編集/etc/systemd/systemして代わりにオーバーライドします。でサービスファイルを編集しないでください/usr/lib/。クレジット@ryeagerおよび@ 0xC0000022L

8
TimeoutSec=infinity—これにより再起動が無期限にブロックされる可能性はありませんか?そのプロセスが終了するのに「永久に」かかる場合はどうなりますか?私のような、大規模な量をお勧めしたい5min、おそらくないinfinity...
アレクシス・ヴィルケ

6
/ usr / libのサービスファイルを編集しないでください
。/etc/systemd/systemで

5
アドバイスの要点は健全ですが、@ ryeager ... systemd提供の最新バージョンに同意する必要がありますsystemctl edit(そしてmask、それとは対照的に、ブルートフォースで無効にするdisable)。のファイルは決して編集しないでください/usr/lib/systemd
0xC0000022L

3
TimeoutSec=infinityここでは動作しませんでしたTimeOutSec=900(15分)を使用し、それは私の後部を保存しました。- systemctl daemon-reloadその後、サービスを再起動する前に実行する必要がありました。
JCCyC

10

ランニング systemctl show SERVICE_NAME.service -p TimeoutStopUSecと、少なくともsystemdによって設定されたタイムアウトがサービスに表示されます。

スクリプトを適切に機能させるために、スクリプトを通常のユニットファイルに変更しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.