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
设置某些额外的环境变量,即COLUMNS
和LINES
。这可以通过比较env | grep COLUMNS
和轻松验证watch 'env | grep COLUMNS'
。
当COLUMNS
设置时,ps
将其输出截断为一行中的那么多字符,即使输出通过管道传输到grep
(或其他任何内容)。(ps
,你为什么要这样对我?)。强制在命令COLUMNS
中为空足以使工作符合OP(和我)的预期。watch
ps
顺便说一句,为了避免watch
和grep
进程成为您监视的输出的一部分,请考虑添加[]
如下内容:
watch "COLUMNS= ps aux | grep [T]heProcessYouWatch"
(当然,我也建议熟悉pgrep
一下。其他答案也会对此有所帮助。)
答案3
ps
是产生人类可读输出的实用程序,而依赖于 grepping 人类可读文本则是个坏主意。您应该使用pgrep myShittyProcess
而不是ps aux | grep myShittyProcess
。pgrep
产生 pid 的裸列表,如果您想要不那么无聊的输出,您可以将pgrep
的输出传递给ps
:
ps -opid,user,args -p `pgrep myShittyProcess`
要使用该单行命令,watch
您应该将其括在' '
(不是" "
)中,以防止早期的 shell 命令替换:
watch 'ps -opid,user,args -p `pgrep myShittyProcess`'