
UNIXでは、どのプロセスが6時間以上実行されているかを知りたいです。どうやって見つけることができますか?
答え1
利用可能な項目に応じて、一般的なアプローチは次のとおりです。
ps -o pid,lstart
以下を使用して、結果に対して for ループを実行します。
date -j -f %c "$sdate" +%s
日付をUNIXタイムスタンプに変換します。そこでそれは次のとおりです。
time=$((`date +%s`-`date -j -f %c "$sdate" +%s`))
echo $time
プロセスが実行された時間(秒)を知らせる必要があります。時間に変換するのは簡単です。
つまり、スクリプトの作成が完了します。
答え2
次の機能を使用して、プロセスの実行時間を分単位で取得できます。
GetProcTime() {
local p=$1
ps -eao "%C %U %c %t" |
awk "/$p/"'{print $4}' |
awk -F":" '{{a=$1*60} {b=a+$2}; if ( NF != 2 ) print b ; else print $1 }'
}
テスト
root@ubuntu:/tmp# GetProcTime monit
10
root@ubuntu:/tmp# if [[ $(GetProcTime monit) -ge 360 ]]; then echo "Process is running more than 6 hrs"; else echo "OK"; fi
OK
root@ubuntu:/tmp# GetProcTime init
466
root@ubuntu:/tmp# if [[ $(GetProcTime init) -ge 360 ]]; then echo "Process is running more than 6 hrs"; else echo "OK"; fi
Process is running more than 6 hrs
答え3
このコマンドは、昨日からn時間以上実行されたプロセスを出力します。プロセスは今日のプロセスのみをスキャンします。
ps -Ao ppid,pid,user,stime,cmd --sort=-pcpu | awk -v dateee=$(date +%H) '{ if (substr($4,3,1) ==":" && ( dateee-substr($4,1,2) > 5 )) print }'
要件に応じて、次のセクションを変更できます。たとえば、5時間。
dateee-substr($4,1,2) > 5 )
答え4
ps -o etime
POSIXlyおよびC / POSIXロケールでは、に依存できるはずです[dd-]hh:mm:ss
。したがって、少なくとも6時間実行されたプロセスは、ゼロ以外のdd-
部分があるか、そのhh
部分が06より大きいプロセスになります。
LC_ALL=C ps -Ao etime,pid |
LC_ALL=C awk '$1 ~ /[1-9].*-|([1-9].|0[6-9]):..:/ {print $2}'
6時間以上実行されたプロセスのpidが報告されます。
プロセスは寿命の間に複数のコマンドを実行でき、しばしば実行します。