私が現在働いている会社には、初期化スクリプトが以前の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サービスは起動に時間がかかり、常にタイムアウトするため、問題は解決しました。
システムファイルを編集します。
- 現代版の場合
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/
(説明を参照)。
- 現代版の場合
TimeoutStartSec
、TimeoutStopSec
または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
- また、次のいずれかを実行して現在のタイムアウト状態を確認できます(ただし、変更するにはサービスを編集する必要があります!ステップ1を参照)。混乱することに、関連する属性の名前には、マイクロ秒を表す「U」があります。バラよりこのGithubの問題より多くの情報を知りたい場合:
次に、systemdを再ロードする必要があります。
systemctl reload node.service
今サービスを始めましょう
systemctl start node.service
それがうまくいかない場合、systemctlを再起動してみてください。
systemctl reboot
それがうまくいかない場合
--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/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分を使用しています。