这不是一个实际的问题 - 但更像是一个奇怪的问题,当我运行时,while true; do ps aux | grep abc; echo done; done
我得到以下信息:
user 29733 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29735 0.0 0.0 11748 920 pts/1 S+ 20:25 0:00 grep --color=auto abc
done
user 29737 0.0 0.0 11748 924 pts/1 S+ 20:25 0:00 grep --color=auto abc
done
done
done
done
user 29745 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29747 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29749 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29751 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29753 0.0 0.0 11748 924 pts/1 S+ 20:25 0:00 grep --color=auto abc
done
user 29755 0.0 0.0 11748 924 pts/1 S+ 20:25 0:00 grep --color=auto abc
done
done
user 29759 0.0 0.0 11748 924 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
user 29761 0.0 0.0 11748 920 pts/1 R+ 20:25 0:00 grep --color=auto abc
done
有时grep
实际上并没有看到自己ps aux
。这只是两个进程运行之间的时间问题吗?当我单独运行命令而不是循环运行命令时,也会发生这种情况。
这种情况在我的计算机和通过 ssh 的另一台计算机上都会发生,但在远程计算机(输出来自该计算机)上发生的频率更高。
乌班图14.04
答案1
正如你提到的,我认为这只是时机。管道上的命令同时运行,您可以找到更多信息 管道命令按什么顺序运行?。如果您的 CPU 较多/较少或进程较多/较少,这种情况可能会在计算机上更频繁地发生。
答案2
这是时间相关的。你几乎总是不希望 grep 命令本身成为输出的一部分,特别是当您过滤 ps 并计划杀死结果时;-)
通常的习惯用法/技巧是:
while true; do ps aux | grep [a]bc; echo done; sleep 1; done
这意味着 grep 仍然会找到带有 abc 的任何内容,但 grep 命令本身不会匹配,因为它实际上是“[a]bc”...
如果您使用的是 Linux 或更现代的 Unix
watch -n1 'ps aux | grep [a]bc'
比 while..done 循环短一点
答案3
这确实与时间有关。
如果您不想看到 grep 命令,您可以执行两件事,具体取决于您的用例。
如果您只需要查看 pids,请执行以下操作:
pgrep -l python
如果您需要更多详细信息:
ps aux | grep python | grep -v grep