2013-04-30 43 views
2

我试图使用管道和xargs的开始顶部与特定的PID,但我不能让它的工作,我不知道为什么:管道和xargs的=>顶

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

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

我在这里做错了什么?

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

+0

删除从-p标志 '身份证',然后再试一次。 – 2013-04-30 19:33:46

回答

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; }') 
+0

恩,那不行。 “-pid”确实是我的最佳选择,而不是“-p” – anonymous1fsdfds 2013-04-30 19:44:27

+0

这很有趣。你使用哪种Linux版本,以及什么版本的'top'(运行'top -v')? – 2013-04-30 19:45:48

+0

如果您指定'-pid'而不是'-p',但另外使用我建议的命令,它是否工作? – 2013-04-30 19:46:52

2

你的问题是

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

试试这个:

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

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

top -p "$(pgrep --newest ProgramName)" 
+0

用于'pgrep'的+1。我以前从未见过。 – 2013-04-30 19:39:09

+0

我的顶部以“-pid”作为选项,而不是“-p”,而且我的系统上没有“pgrep”,但无论如何感谢您的答案! – anonymous1fsdfds 2013-04-30 19:43:20