.png)
さて、最初の投稿!そのため、特定のプロセス名で5分以上経過したプロセスを確認する必要があります。問題は、システムがCentOS 4のカスタムビルドであるため、pmisc 21.4があり、killallが22.9まで-o / - -older-thanを統合していないことです。システムをアップグレードするオプションがないので、そう提案しないでください。これは外部からアクセスできない内部システムなので、潜在的なセキュリティ問題はこの顧客にとって大きな問題ではありません。
エンジニアはこのプロセスが時折中断される理由を特定するためにソリューションを研究していますが、その間にスクリプトをクローンしてプロセスを確認し、5分以上実行している場合は終了します。なぜなら、一般的に30~45秒しかかからないからです。完了します。
ps出力、いくつかのegrep、およびregex構文を使用してこれを行うことができると確信していますが、それらをすべて統合する方法がわかりません。
このプロセスを「同期化」といいます。誰かが私に次の提案コードを与えましたが、うまくいかないようです。
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etime $i | cut -d":" -f 2)
if [ "$TIME" -gt 4 ] ; then
kill $i
fi
done
答え1
-o etimes
人間に優しい表現ではなく、秒単位で時間を表現してみてください。その後、削除してcut
時間が300秒以上であることを確認できます。
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etimes $i)
if [ "$TIME" -ge 300 ] ; then
kill $i
fi
done
答え2
マニュアルページによると、形式はですetime
。[[DD-]hh:]mm:ss
一部のフィールドが欠落している可能性があるため、構文解析が少し迷惑になります。
プロセスが短期間だけ実行されたと仮定する場合、最初のフィールドは分でなければなりません。したがって、cut -d: -f1
代わりに試してみてください-f2
。しかし、プロセスがしばらく実行された場合は、数時間かかります。
(etimes
はるかに良いですが、psmisc 22.2-5にもないようで、おそらく使えないようです。)
答え3
古いCentOS 4にこだわったら試してみるfind
価値があります。
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mmin +5 -exec kill {} \;
答え4
C++ を気にせず、コンピュータに十分なリソースがある場合は、次の再帰プログラムを作成できます。
int main()
{
int Started;
int Passed;
RUNAGAIN:
system("time=$(date); echo $time > ~/timeStarted");
CHECKTIME:
system("passed0=$(date); echo $passed0 > ~/timePassed; passed 1=$(cut -c15,16 ~/timePassed); echo $passed1 > ~/timePassedCut; started0=$(cut -c15,16 ~/timeStarted; echo $started0 > ~/timeStartedCut");
ifstream STARTED("~/timeStartedCut");
STARTED>>Started;
STARTED.close();
ifstream PASSED("~/timePassedCut");
PASSED>>Passed;
PASSED.close();
int TimePassed
TimePassed = Started - Passed;
if(TimePassed>4)
{
system("killall *process name here*; ~/*process name here*//to start it again, omit if uneeded//");
goto RUNAGAIN;
}
else if(TimePassed<5)
{
goto CHECKTIME;
}
}
プログラムが開始された日付を抽出し、時間から分を切り取り、ファイルに書き込み、ファイルを変数としてロードし、一定時間が経過した後に同じことを行い、開始時間(分)の差が計算されたら、時間を確認してください。 、5分以上の場合、プロセスは終了します。プロセスとタイマーが同時に起動されるようにするには、以下を含むデフォルトのシェルスクリプトを使用して関連プロセスを開始します。
#!/bin/sh
~/*process name here* & ~/CheckTime