ps输出/管道执行顺序

ps输出/管道执行顺序

我跑ps aux | grep somethinghere

输出显示grep somethinghere为正在运行的进程。

我的问题是,不应该ps aux先完成,然后grep somethinghere再运行其输出吗?也许不需要ps完成(它们之间有一个管道),但它应该作为第一个进程运行,而grep不是运行。

输出意味着grep之前运行过ps

这怎么样?不应该ps首先运行,因为它的输出应该通过管道传输到grep?即使它们同时运行,为什么我总是grep在输出中看到?难道我有时也见不到grep吗?

答案1

你应该看看这一页


编辑,现在我明白你在问什么:


或许会更好地帮助解释。

命令运行的顺序实际上并不重要,并且不能保证。抛开 Pipe()、fork()、dup() 和 execve() 的神秘细节不谈,shell 首先创建管道,即数据在进程之间流动的管道,然后创建进程,其结尾为连接到它们的管道。运行的第一个进程可能会阻塞等待来自第二个进程的输入,或者阻塞等待第二个进程开始从管道读取数据。这些等待可以是任意长的,但并不重要。无论进程以哪种顺序运行,数据最终都会被传输并且一切正常。

答案2

我认为OP的意思是“如何从过程的输出列表中剥离grep somethinghere过程”。有十几种方法可以做到这一点:pssomethinghere

  1. 如果您只需要号码,您可以使用pgrep -l somethinghere
  2. 双倍的grep ps aux | grep somethinghere | grep -v grep(经常见面,但我不喜欢)
  3. 制作一些正则表达式somethinghere ps aux | grep [s]omethinghere

相关内容