我需要知道 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
POSIXly,并且在 C/POSIX 语言环境中,您应该能够依靠ps -o etime
以[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。
请注意,一个进程可以(并且经常)在其生命周期中运行多个命令。