Linux / Bash使用PS -f特定PID返回的格式与PS -f不同,另外还有关于使用Grep解析的问题

4 投票
3 回答
9224 浏览
提问于 2025-04-16 04:33

我正在创建一个Python脚本,需要先根据进程的名字获取它的PID(进程ID),然后再通过这个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(通过名字),这样我就可以在需要的时候关闭这个程序的实例。如果你有什么建议可以帮助我改进这个方法,我会很感激。

3 个回答

0

那用这个怎么样呢

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

它应该会给你进程ID(PID)和时间(TIME)
(这个内容改编自这里

编辑:
这是带有 -ef 的版本

ps -ef | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $7}'
0

如果你想要一致的CPU时间表示,可以查看 /proc/<pid>/stat 文件,里面有 utimestime 这两个字段。

想要了解这个文件的完整结构,可以查看 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
3

使用 -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 命令,只列出符合特定条件的进程。

撰写回答