私が使用しているサードパーティのツールにスレッド「リーク」を引き起こす既知のバグがあるようです。スレッドに他のプログラムとの通信問題があり、そのスレッドがクリーンアップされていない場合、スレッドは最終的にゾンビ状態になります。
これは通信に問題がある場合にのみ発生するため、スレッドが積み重なるのにどれくらい時間がかかるかわからず、積み重ねずに数ヶ月間行くことも、限界点まで行くこともできます。 1時間。通信問題に対する最悪のシナリオ。
スレッドが積み重なるのを防ぐために私ができることはあまりありません。回避策として、スレッド数がulimit値に近づくと、アプリケーションを自動的に再起動するようにプログラムを構成したいと思います。私はこれを行うための最良の方法が何であるか疑問に思います。
毎時間実行されるクローンジョブを作成し、プロセスの状態を確認してから再起動できます。クローン作業アプローチのように、制限に達してから59分かかる最悪の場合ではなく、ulimitに達した後にすぐに再起動することが望ましいですか?より簡単な方法はありますか?
答え1
これを行うには、crontabユーティリティを使用できます。
ファイルを作成し、その中にスクリプトを置きます。監視するプログラムの名前を変更します。
名前をscript.shとし、ファイルを保存します。
#!/bin/sh
MAX_THREADS=60
PROGRAM_NAME="firefox"
PID=$(ps -A | grep $PROGRAM_NAME | sed 's/\([0-9]*\).*/\1/')
CUR_NO_THREADS=$(cat /proc/"$PID"/status | grep Threads | tr -dc '0-9');
if [ "CUR_NO_THREADS" -ge "$MAX_THREADS" ];
then
killall $PROGRAM_NAME;
$PROGRAM_NAME;
fi;
次に、crontabを次のように実行します。
sudo crontab -e
これにより、vimまたはnanoでファイルが開き、そのファイルに保存されます。
0 * * * * /path/to/script/script.sh