Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定在linux中运行超过3小时的进程_Linux_Awk_Sed - Fatal编程技术网

确定在linux中运行超过3小时的进程

确定在linux中运行超过3小时的进程,linux,awk,sed,Linux,Awk,Sed,我想找出运行超过3小时的进程,我已经为此编写了一个命令,但它没有返回预期的输出 ps -u <user> -o pid,stime,pcpu,pmem,etime,cmd --sort=start_time | \ grep <searchString> | grep -v grep| awk '{print $5}' | \ sed 's/:|-/ /g;'| awk '{print $4" "$3" "$2" "$1"}' | \

我想找出运行超过3小时的进程,我已经为此编写了一个命令,但它没有返回预期的输出

ps -u <user> -o pid,stime,pcpu,pmem,etime,cmd --sort=start_time | \
    grep <searchString> | grep -v grep| awk '{print $5}' | \
        sed 's/:|-/ /g;'| awk '{print $4" "$3" "$2" "$1"}' | \
            awk '$1+$2*60+$3*3600+$4*86400 > 10800' 
ps-u-opid,stime,pcpu,pmem,etime,cmd--sort=start_time|\
grep | grep-v grep | awk{print$5}}\
sed's/:|-//g;'|awk“{打印$4”“$3”“$2”“$1”“}”\
awk'$1+2*60+3*3600+4*86400>10800'
但它在输出中打印etime的值。但预期的输出是,命令应该打印“pid、stime、pcpu、pmem、etime、cmd”的值

我找不到这方面的确切问题。

您正在执行“awk'{print$5}'”,它接收输入并只打印出第5列(在您的情况下是“etime”),从这一点开始,所有内容都将丢失

如果您的系统支持etimes(请注意末尾的s),您可以使用

ps -eo pid,etimes,etime,comm,user,tty | awk '{if ( $2>10800) print $0}' 
在不支持时间的系统上,该系统的时间标准输出为hh:mm:ss,如果没有时间,则仅为mm:ss

ps -eo pid,etime,comm,user,tty | awk '{seconds_old=10800 ; split($2,a,":",sep)  ; if(length(a) < 3)  b = (a[1] *60) + (a[2]) ; else  b=((a[1]*3600) + (a[2] *60) + (a[3])) ; if(b > seconds_old ) print $0}'
ps-eopid,etime,comm,user,tty|awk'{seconds_old=10800;split($2,a,“:”,sep);if(length(a)<3)b=(a[1]*60)+(a[2]);else b=(a[1]*3600)+(a[2]*60)+(a[3]);if(b>seconds_old)print$0}
调整“秒数”以更改要测试的年龄:

使用Find进行此操作还有其他多种方法,例如: 解释如下:

但是,解决方案应该与您的预期输出相匹配

请尝试以下方法:

ps -u <user> -o pid,stime,pcpu,pmem,etime,cmd --sort=start_time | \
    grep <searchString> | grep -v grep| awk '{print $5}' | \
        sed 's/:|-/ /g;'| awk '{print $4" "$3" "$2" "$1"}' | \
            awk '$1+$2*60+$3*3600+$4*86400 > 10800' 
ps-u-o pid,stime,pcpu,pmem,etime=,cmd--sort=start|u time | grep |而read z;do tago=$(echo$z | awk'{print$5}'| sed-E's/(:|-)//g''awk'{print$4+$3*60+$2*3600+$1*86400');如果[$tago-ge 10800];那么echo$z;fi done

它只打印
>=10800
秒旧的进程。
您可以进一步调整输出以满足您的需要。

使用以下命令可以找到运行超过3小时的进程

ps -u <user> -o pid,stime,pcpu,pmem,etime,cmd --sort=start_time |grep -v grep|awk 'substr($0,23,2) > 3'
ps-u-o pid,stime,pcpu,pmem,etime,cmd--sort=start_time | grep-v grep | awk'substr($0,23,2)>3'

脚本中的问题来自于不同的时间戳有不同的格式,如果以后需要解析,请不要使用。还有3种可用格式,也要小心使用。这些列有奇怪的格式。系统不支持时间,因此将其转换为秒,然后checkingi将使用解决方案进行更新对于没有Etimes的系统,请您帮助我修改上述命令以处理格式“2-02:03:12”它不工作…它仍在打印运行时间少于3小时的所有进程您在哪个发行版/操作系统上运行它?