4

对于我正在创建的 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 的位置不应该改变(我只是从我找到的一个片段中得到这个)

但是,当我尝试做类似的事情来获取 TIME 值时,例如它会以不同的方式返回它

ps -f 5686

返回:

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

因此,当我尝试如下切割时,我认为它不能正常工作,因为我不确定此返回的间距是否一致,并且它显示的时间值也与以前不同(不是原始的“00:00 :00" 样式的打印输出。

ps -f 5686 | cut -c40-47

我在我的 python 脚本中使用它来记录特定进程类型(按名称)的 PI​​D,以便我以后可以在需要时关闭该程序的实例。任何关于我可以做些什么来纠正我的方法的建议都值得赞赏

4

3 回答 3

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 命令仅列出符合给定条件的进程。

于 2010-09-24T09:44:51.000 回答
0

怎么用

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

它应该给你 PID 和 TIME(改编自这里

编辑:
版本与-ef

ps -ef | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $7}'
于 2010-09-24T09:42:15.270 回答
0

如果您想要 CPU 时间的一致表示,请阅读/proc/<pid>/stat和阅读utimeandstime字段。

阅读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
于 2010-09-24T09:47:19.327 回答