代码之家  ›  专栏  ›  技术社区  ›  Rick

Linux/bash使用ps-f以不同于ps-f的格式返回特定的pid,还询问如何使用grep来解析它。

  •  3
  • Rick  · 技术社区  · 15 年前

    我需要,对于我正在创建的python脚本,首先只获取进程的PID(基于其名称),然后使用其PID从该进程中获取,其持续时间,从下面的打印输出中,将是“00:00:00”。

    root      5686     1  0 Sep23 ?        00:00:00 process-name
    

    我用这个来获取PID,进程名为:

    ps -ef |grep `whoami`| grep process-name | cut -c10-15
    

    所以,这很好,我假设切割参数(-C10-15)可以普遍工作,因为PID的位置不应该改变(我只是从我发现的一个片段中得到的)。

    但是,当我尝试做一些类似的事情来获取时间值时,它会以不同的方式返回它。

    ps -f 5686
    

    返回:

    root      5686     1  0 Sep23 ?        S      0:00 /path/to/process
    

    因此,当我尝试一个剪切时,如下面所示,我认为它不会正常工作,因为我不确定返回的间隔是否一致,并且它显示的时间值与以前不同(不是原始的“00:00:00”样式的打印输出)。

    ps -f 5686 | cut -c40-47
    

    我在python脚本中使用它来记录特定进程类型(按名称)的pid,以便以后在需要时关闭该progra实例。对于我能做些什么来纠正我的方法,我很感激。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Dave Kirby    15 年前

    使用-o选项控制输出的数据和顺序。

    例如

    $ ps -o pid,time,comm
      PID     TIME COMMAND
     3029 00:00:01 zsh
    22046 00:00:00 ps
    

    $ ps -o pid,time,comm --no-headers
     3029 00:00:01 zsh
    22046 00:00:00 ps
    

    这将使解析更容易。我建议使用python解析输出 (pid, time, cmd) = result.split(2)

    或者,使用pgrep命令只列出符合给定条件的进程。

        2
  •  0
  •   Unreason    15 年前

    用什么呢

    ps ux | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $10}'
    

    它应该给你PID和时间 (改编自 here )

    编辑:
    版本 -ef

    ps -ef | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $7}'
    
        3
  •  0
  •   Alnitak    15 年前

    如果要一致地表示CPU时间,请读取 /proc/<pid>/stat 并阅读 utime stime 领域。

    man 5 proc 要获得该文件的完整布局,最简单的一点是需要第14和第15个值,它们用“jiffies”(通常每秒100个)表示,例如。

    % ps -e 2398
    2398 ?        00:04:29 ypbind
    

    00:04:29是269秒

    % awk '{ print ($14 + $15) / 100 }' < /proc/2398/stat
    269.26
    

    或者,在不生成子进程的bash脚本中:

    #!/bin/sh
    read -a procstat /proc/pid/stat
    let cpu=(procstat[13] + procstat[14]) / 100