为什么ps格式选项'%a'被截断?

时间:2012-05-25 13:11:00

标签: bash ps

我正在尝试使用ps指定的自定义格式读取-o的输出。因为我想指定一个自定义分隔符,我正在使用AIX格式描述符(例如%p用于pid,%a用于args等),但在使用普通格式代码时会出现同样的问题。

当我在此格式字符串的末尾指定%a时,所有内容都按预期工作:

$ echo 'while true; do sleep 1; done' > really-really-really-long-filename 

$ bash really-really-really-long-filename &
[1] 31181

$ ps -p 31181 -o '%p|%a'

  PID|COMMAND
31181|bash really-really-really-long-filename

但是,如果%a不是最后一个字段,我会得到:

$ ps -p 31181 -o '%a|%p'

COMMAND                    |  PID
bash really-really-really-l|31181

这似乎与任何屏幕宽度修饰符无关。还有其他什么在玩吗?

(GNU bash 4.1.5)

1 个答案:

答案 0 :(得分:3)

也许不是最优雅的解决方案,但您可以混合和匹配格式,这样您就可以对选定的字段使用宽度控制。 E.g。

[me@home]$ ps -p 780 -o "%a|%p"
COMMAND                    |  PID
dbus-daemon --system --fork|  780

[me@home]$ ps -p 780 -o args:50 -o "|%p"
COMMAND                                           |  PID
dbus-daemon --system --fork --activation=upstart  |  780

至于截断发生的原因,我的 guess 是一个硬编码宽度,用于每个字段(除非用户指定宽度),当它不是最后一个字段时。这节省了程序必须首先缓冲输出以确定打印前的最大列宽。

如果是args,则默认的硬编码宽度似乎为27(请参阅this implementation of ps中的第1302行)。

我应该提一下,这只是我的一个纯粹推测,可能不一定如此。