UNIX - 6時間以上実行されたプロセスの識別

UNIX - 6時間以上実行されたプロセスの識別

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 etimePOSIXlyおよび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が報告されます。

プロセスは寿命の間に複数のコマンドを実行でき、しばしば実行します。

関連情報