在 tmux 中观察“ps aux | grep blah”的输出不起作用?

在 tmux 中观察“ps aux | grep blah”的输出不起作用?

watch "ps aux | grep myShittyProcess"我正在尝试在 tmux 会话中运行它 。此过程myShittyProcess也是在 tmux 会话中启动的。ps aux它无需 watch 命令即可运行。但是,一旦我将其放入 watch 中,它就会无法执行。如何让它工作?

- 编辑 -

ps发现将 tmux 调整为全屏后就可以正常工作。这与输出换行有关,grep无法在换行上下文中找到。

答案1

正如问题编辑中提到的那样xzfc 的回答ps aux | grep [q]uote,该问题似乎与 tmux 的换行有关。如果您不需要用户信息,则更接近于 的直接替代品,请尝试:

$ pgrep -af [q]uote
392 bash -c sleep 5 && echo quote
399 bash -c sleep 5 && echo second quote

$ watch pgrep -af [q]uote

-a标志使输出包含命令行参数,同时-f允许您搜索命令行参数以及进程名称。

答案2

跑步

watch "COLUMNS= ps aux | grep TheProcessYouWatch"

解释:watch设置某些额外的环境变量,即COLUMNSLINES。这可以通过比较env | grep COLUMNS和轻松验证watch 'env | grep COLUMNS'

COLUMNS设置时,ps将其输出截断为一行中的那么多字符,即使输出通过管道传输到grep(或其他任何内容)。(ps,你为什么要这样对我?)。强制在命令COLUMNS中为空足以使工作符合OP(和我)的预期。watchps

顺便说一句,为了避免watchgrep进程成为您监视的输出的一部分,请考虑添加[]如下内容:

watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"

(当然,我也建议熟悉pgrep一下。其他答案也会对此有所帮助。)

答案3

ps是产生人类可读输出的实用程序,而依赖于 grepping 人类可读文本则是个坏主意。您应该使用pgrep myShittyProcess而不是ps aux | grep myShittyProcesspgrep产生 pid 的裸列表,如果您想要不那么无聊的输出,您可以将pgrep的输出传递给ps

ps -opid,user,args -p `pgrep myShittyProcess`

要使用该单行命令,watch您应该将其括在' '(不是" ")中,以防止早期的 shell 命令替换:

watch 'ps -opid,user,args -p `pgrep myShittyProcess`'

相关内容