2

我正在尝试使用管道和 xargs 从特定的 pid 开始,但我无法让它工作,我不知道为什么:

ps aux|grep ProgramName|awk '{print $2}'|head -n1|xargs top -pid

如果我在head -n1之后停止,我会在屏幕上打印正确的 pid ,并且手动将该 pid 添加到命令top -pid XXX也可以,但是将整行作为一个命令运行不会返回顶部屏幕。

我在这里做错了什么?

编辑:是的,“-pid”确实是正确的(进一步检查远程外壳显示它实际上是基于 Mac OS 的系统,而不是 Linux 系统)

4

2 回答 2

3

我在这里做错了什么?

几件事:

  1. 您正在使用grepawk在同一管道中。既然awk是模式匹配,就没有理由将grep其用作单独的过程。

  2. 您正在使用awkhead在同一管道中。由于awk可以控制它打印的项目数量,因此无需使用head.

  3. 您的grep命令将找到指定的程序grep程序。

  4. 您正在使用xargs提供单个命令行参数。要么反引号,要么$()是更好的选择。

  5. top需要一个-p开关,而不是一个-pid开关。(至少在我的电脑上。)

全部加起来,试试:

$ top -p $(ps aux | awk '/ProgramName/ && ! /awk/ { print $2; exit; }')
于 2013-04-30T19:36:44.357 回答
2

你的问题是

  1. 顶部的 arg 应该是“-p”而不是“-pid”
  2. xargs 用于运行非交互式程序

尝试这个:

top -p "$(pgrep ProgramName | head -n 1)"

或者

top -p "$(pgrep --oldest ProgramName)"

或者

top -p "$(pgrep --newest ProgramName)"
于 2013-04-30T19:38:21.147 回答