私は8コアCPUシステムを持っていますが、毎日すべてのCPUコアが休止プロセスによってブロックされているので、CPUを復元するには手動でシャットダウンする必要があります。
次のプロセスを自動的に終了したい
- 2時間以上寝て、
- CPU使用率が90%を超えています。
これらのプロセスのPIDを見つけて終了する方法は?
htopの出力は、PIDが134425のプロセスが休止状態であり、CPUコアをブロックしていることを示しています。
メモ:
これはすべての休止プロセスのPIDを提供しますが、CPU使用率は考慮しません。
awk '/sleeping/{ $0=FILENAME; gsub(/[^0-9]/, ""); print $0 }' /proc/[0-9]*/status
答え1
ランアウェイプロセスの根本原因を見つけるのが最善ですが、状態S
にあるが一定量のCPUを使用するプロセスを見つけるには、次のスクリプトを使用できます。
#!/usr/bin/env bash
ps ahxo pid,state,%cpu |\
while read pid state cpu; do
if [[ "$state" = S ]]; then
if [[ "${cpu%%.*}" -gt 90 ]]; then
echo "woe betide pid $pid"
fi
fi
done
スクリプトがシステムを壊さないと確信している場合は、代わりにkill
使用してください。フィールドに基づいて一致を制限するか、コマンドを使用して適切なPIDを最初にフィルタリングすると、echo
リスクを軽減できます。人間の性質を考慮すると、出力から「2時間以上」をキャプチャすることは困難です。command
pgrep
ps
time
/proc/$pid/stat
危険かもしれませんプロセス名にスペースが表示されるかどうか。あるいは、モニタリングスクリプトがより複雑になり、必要な条件を持つPIDを確認する回数を記録するステータスカウンタを維持できます。もう少し複雑な「2時間以上」チェックを実行する前に、上記のスクリプトが機能していることを確認してください。
別のアプローチは、監視システムを使用して定期的にサービスに要求を送信し、要求がタイムアウトしたり長すぎる場合にそのシステムにサービスを再開させることです。しかし、時々ほうきで叩かなければならない場合、このような絆創膏は良い長期的な解決策ではありません。
サービスに何かが破損していることを示す一種のログファイルがある場合、これは自動的にエラーを検出し、「オフにして再びオンにする」別の方法かもしれません。
もちろん、再起動の自動化により、誤ったプロセスが終了したり終了したりしないプロセスが終了した場合、重大なエラーが発生する可能性があります。これは、問題を見つけて解決したり、管理者が問題を解決するために必要なリソースを費やす意思がない場合にソフトウェアを廃棄するために使用できます。管理チームが変更を許可しないという問題が原因で、crontab操作でメモリが大量に漏れています*/5 * * * * /reboot-service
。より多くの仕事。