2

我正在尝试读取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 重击 4.1.5)

4

1 回答 1

3

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

[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

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

args默认硬编码的情况下,宽度似乎是27(请参阅此实现ps)。

我应该提一下,这只是我的一个纯粹的猜测,不一定是这样。

于 2012-05-25T13:25:49.610 回答