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

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

私が現在働いている会社には、初期化スクリプトが以前の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.confとしましたが、タイムアウトが90s発生し続けます。

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

サービスはJava 7を使用して実行され、それをデーモン化します。JSVC-wait値でパラメータを設定しました120

答え1

私のsystemdサービスは起動に時間がかかり、常にタイムアウトするため、問題は解決しました。

  1. システムファイルを編集します。

    • 現代版の場合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. TimeoutStartSecTimeoutStopSecまたはTimeoutSec(詳細はここ) は、プロセスの開始と停止のタイムアウトを指定します。その後、私のシステムファイルは次のようになります。

    [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を再起動してみてください。systemctl reboot

  6. それがうまくいかない場合--no-block、次のようにsystemctlオプションを試してください。systemctl --no-block start node.service。このオプションには説明があります。ここ: "要求されたジョブが完了するまで同期的に待機しないでください。指定しない場合、ジョブは検証されキューに追加され、systemctlはデバイスの起動が完了するのを待ちます。このパラメータを渡すと検証とキューに入れられます。のみ実行されます。

    • systemctl mask代わりに使用できるオプションもありますsystemctl start。詳細についてはをご覧ください。ここ

コメントの更新:

  • TimeoutSec=infinity:ここでは、「無限大」を使用するのではなく、長い時間(たとえばTimeoutSec=90015分)を使用します。アプリケーションの終了に「永久」時間がかかると、再起動が無期限にブロックされる可能性があります。画像ソース:@ Alexis Wilkeと@ JCCyC
  • /usr/lib/systemd/systemを編集するのではなく、上書きまたは編集systemctl editしてみてください/etc/systemd/system/usr/lib/@ryeagerと@0xC0000022Lを編集しないでください。

**システムソース文書で更新**これらのタイムアウトパラメータの値に「無限大」を指定した場合、タイムアウトロジックは次のようになります。障害のある

JobTimeoutSec=, JobRunningTimeoutSec=,TimeoutStartSec=,  TimeoutAbortSec=

JobRunningTimeoutSec = このDefaultTimeoutStartSec =のデバイスデバイスを除いて、デフォルトは「無限大」(タスクタイムアウトが無効)です。

引用:ここにリンクの説明を入力してください

繰り返しますが、このロジックはサービスレベルに適用され、以下のURLに明確に記載されています。引用:ここにリンクの説明を入力してください

答え2

実行すると、systemctl show SERVICE_NAME.service -p TimeoutStopUSec少なくとも私のサービスに対してsystemdによって設定されたタイムアウトが表示されます。

正常に動作するようにスクリプトを通常の単位ファイルの1つに変更しました。

答え3

パッケージのサービスファイルを編集しないでください(/usr/lib/systemd/system/パッケージがアップグレードされたらこのファイルを上書きします)、代わりに次を使用します。

sudo EDITOR=/bin/vi systemctl edit <service-name>

(はい、nanoがデフォルトエディタです!こんな!)

これによりファイルが安全に編集されます/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>

答え4

目的を達成するために、次の3つのコマンドを使用しました。

デフォルトのタイムアウト値を確認するには

systemctl show yourServiceName.service | grep ^Timeout

デフォルトのタイムアウト値を増やすには

mkdir /etc/systemd/system/yourServiceName.service.d
echo -e "[Service]\nTimeoutStartSec=180" | tee /etc/systemd/system/yourServiceName.service.d/startup-timeout.conf

どこ、

  • yourServiceName:サービス名です。たとえば、Fluid、Weblogicなどがあります。
  • TimeoutStartSec=180:ここでは制限時間値として180秒/3分を使用しています。

関連情報