web-dev-qa-db-ja.com

systemdサービスのタイムアウト値を変更するにはどうすればよいですか?

私が現在取り組んでいる会社では、レガシーサービスがあり、その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.confDefaultTimeoutStopSecプロパティを90sに変更しようとしましたが、それでもタイムアウトが発生します。

誰かが60秒でタイムアウトする理由を誰か知っていますか?このタイムアウト値が構成されている他の場所はありますか?確認方法はありますか?

このサービスはJava 7で実行され、デーモン化するには [〜#〜] jsvc [〜#〜] を使用します。-waitパラメータを設定しました値は120です。

37
Caesar Ralf

起動にも時間がかかるため、systemdサービスがタイムアウトし続けたため、これで問題が解決しました。

  1. 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/内のファイルを直接編集するのは安全ではありません(コメントを参照)
  2. TimeoutStartSecTimeoutStopSecまたは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
    
    • これらのいずれかを実行して、現在のタイムアウトステータスを表示することもできます(ただし、変更するにはサービスを編集する必要があります!手順1を参照してください)。紛らわしいことに、関連するプロパティの名前にはマイクロ秒の "U"が付いています。詳細については このGithubの問題 を参照してください:
      • systemctl show node.service -p TimeoutStartUSec
      • systemctl show node.service -p TimeoutStopUSec
      • systemctl show node.service -p TimeoutUSec
  3. 次に、systemdをsystemctl reload node.serviceでリロードする必要があります

  4. systemctl start node.serviceでサービスを開始してください
  5. それがうまくいかない場合systemctl rebootでsystemctlを再起動してみてください
  6. それが機能しない場合、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
64
Katie

ランニング systemctl show SERVICE_NAME.service -p TimeoutStopUSec systemdがサービスに設定したタイムアウトを少なくとも確認できました。

正常に動作するように、スクリプトを通常のユニットファイルに変更しました。

10
Caesar Ralf

パッケージのアップグレード時に上書きされる/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>
0
Tom Hale