使用“ps”查找时间范围内的进程

时间:2012-02-16 15:19:50

标签: linux bash ps

如何在过去5小时内找到已开始处理的内容? ps能做到吗?

我必须使用显示所有流程的ps -ef | grep <username>。然后我必须手动查看STIME列

4 个答案:

答案 0 :(得分:2)

ps -eo etime,pid将以[[DD-]hh:]mm:ss格式列出所有PID以及自创建流程以来经过的时间。这可能会派上用场,因为您可以搜索少于5:00:00的时间量,而不是执行比较棘手的日期比较。

答案 1 :(得分:1)

也许这可以帮到你:

  

做一个ps -aef。这将显示进程的时间   开始。然后使用date命令查找当前时间。计算   两者之间的差异,以找到过程的年龄。

信用额度为:How do you kill all Linux processes that are older than a certain age?

答案 2 :(得分:1)

stat -t /proc/<pid> | awk '{print $14}'

将为您提供自纪元以来数秒内进程的开始时间。与当前时间(date +%s)比较,以秒为单位查找进程的年龄。

答案 3 :(得分:0)

只是为了笑,这是我在一些古老的系统(包括aix和solaris)上必须做的事情,它似乎只是&#34; ok&#34;到目前为止......(但是当将来发生变化时可能会失败。另外,我认为它已经在过程持续超过999天的机器上失败了......当我找到一个时我会解决这个问题)< / p>

在那些古老的系统上:

  • ps的一些选项不存在。 (或solaris&amp; aix或其不同版本之间的差异)。
  • 有些失效的过程要么没有时间,要么也没有用户名,也没有时间,也没有时间。
  • ps对于具有天数> 99
  • 的etime有一点变化

下面的小事照顾那些情况(以及更多)......但真的很难看^^

编辑:新版本(有点理智,多才多艺,但仍然显示你需要处理ps输出很多以获得可用的东西...感谢它有一种奇怪的方式来改变它它显示的信息数量......)

max_size_var_awk="399" #old awk (and nawk) limit of a var size ?!
ps_output_prettifier="%10s %8s %8s %3s %-14s %11s %10s %s\n" #11s for /dev/pts, as it could also be "zoneconsole" in a solaris zone...
truncated_mark="(...)"
size_to_truncate=$(( ${max_size_var_awk} - ${#truncated_mark} ))
tmpfile=

#get the ps output
  ssh localhost "ps -elo user,pid,ppid,nice,etime,tty,time,args" \
   | awk '(NF==5) { $8=$5;$7=$4;$6="-";$5="000-00:00:0-";$4=$3;$3=$2;$2=$1;$1="-"; }
                  { print $0}' \
   | sed -e 's/^  *//' >"${tmpfile:-/tmp/defaulttmp.$$}"


  #we read the ps output, putting the first few items in their respective var, and the rest (cmd + args) in "_rest"
  while read _u _p _pp _n _e _tt _ti _rest ; do

    #special case: we just read the first line:
    [ "$_ti" = "TIME" ] && {
      printf "${ps_output_prettifier}" "$_u" "$_p" "$_pp" "$_n" "99999__$_e" "$_tt" "$_ti" "$_rest"
      continue
    }

    #for all the other lines:
    </dev/null nawk -v u="$_u" -v p="$_p" -v pp="$_pp" -v n="$_n" -v e="$_e" -v tt="$_tt" -v ti="$_ti" -v template="00000-00:00:00"  \
        -v rest="$(printf "%s" "$_rest" | cut -c 1-${size_to_truncate})" -v lrest="${#_rest}" -v trunc="${truncated_mark}" -v totrunc="${size_to_truncate}"  \
        -v ps_output_prettifier="${ps_output_prettifier}" '
           BEGIN { rem="we add the beginning of the template to the beginning of the etime column..."
                   prefix=substr(template,1,length(template)-length(e)) ; e=prefix e;
                   rem="and add the message IF it was truncated"
                   if (lrest>totrunc) { rest=rest trunc ; }
                   rem="modify -hh:mm:ss into .hhmmss to allow sort -n to operate on all (and not just on nb-of-days)"
                   sub(/-/,".",e) ; sub(/:/,"",e) ; sub(/:/,"",e)

                   printf (ps_output_prettifier,u,p,pp,n,e,tt,ti,rest);}'
  done <"${tmpfile:-/tmp/defaulttmp.$$}" \
    | sed -e 's/^/ /' | sort -k5,5nr \
    | sed -e 's/ \([0-9][0-9][0-9][0-9][0-9]\)\.\([0-9][0-9]\)\([0-9][0-9]\)/ \1-\2:\3:/'

旧版本:

复杂的sed(就像最后一个)试图保持对齐(并且输出比ps更加对齐)。 (如果可以,我会使用awk,但是当改变$ 1,$ 2,...或$ 0的任何东西重新计算整行时,我不能轻易地保持对齐。也许我应该做简单的事情并处理所有事情通过一个更简单的printf进行重新调整?....我会在以后的某个时间做到这一点!(但我担心长的args线可能会搞砸了......而且我不知道怎么告诉printf&#34;只是格式化前几个args,并将其他所有内容放在最后的%s&#34;)

重新加入常规ps&#39;时间&#39;这将是一些工作,因为它有1或2列,无论过程是否多于或少于24小时,并且间距将再次变得错误,最后一个sed将失败,等等。

LC_ALL=C
ps -eo user,pid,ppid,nice,etime,tty,time,args \
 | sed   -e 's/^\( *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)  \([0-9]-\)/\1 00\2/'                \
         -e 's/^\( *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\) \([0-9][0-9]-\)/\1 0\2/'             \
         -e 's/^\( *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)    \([0-9][0-9]:\)/\1 000-\2/'       \
         -e 's/^\( *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)       \([0-9][0-9]:\)/\1 000-00:\2/' \
         -e 's/^\( *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*\)           -/\1 0?_-__:__:__/'        \
 | sed -e 's/^/ /' | sed -e 's/\([0-9]\)-/\1./' | sed -e 's/\([0-9][0-9]\):\([0-9][0-9]\):/\1\2/'        \
 | sed -e 's/NI     ELAPSED/NI 999._ELAPSED/'                                                            \
 | sort -k5,5nr                                                                                          \
 | sed -e 's/\( [0-9][0-9][0-9]\)\.\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\) /\1-\2:\3:\4 /'            \
 | sed -e 's/^  *\([^ ][^ ]*\)\(  *\)\([^ ][^ ]*\)\(  *\)\([^ ][^ ]*\)\(  *\)\([^ ][^ ]*\)\(  *\)\([^ ][^ ]*\)$/ ________ \1 \3 \5 0?_-__:__:__      -    \7 \9/'

享受^^ [它仍然是一项正在进行的工作...到目前为止工作,但我无法在其他系统上尝试(Linux?其他版本的aix&amp; solaris等)]