2013-04-30 3 views
2

Я пытаюсь использовать трубы и xargs, чтобы начать сверху с определенной ФИД, но я не могу заставить его работать, и я не знаю, почему:Трубы и xargs => Верхняя

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

Я получаю правильный pid напечатан на экране, если я остановлюсь после head -n1, и вручную добавив, что pid для команды top -pid XXX также работает, но работает целая строка, так как одна команда просто не возвращает верхний экран.

Что я здесь делаю неправильно?

правок: да, «-pid» действительно правильный (далее проверяя удаленной оболочки показало, что на самом деле система, основанная Mac OS, а не Linux один)

+0

Удалить 'идентификатор' от этого флага -p и повторите попытку. –

ответ

3

Что я делаю неправильно Вот?

Несколько вещей:

  1. Вы используете grep и awk в том же трубопроводе. Поскольку awk действительно соответствует шаблону, нет причин использовать grep как отдельный процесс.

  2. Вы используете awk и head в том же трубопроводе. Поскольку awk может управлять количеством элементов, которые он печатает, нет необходимости использовать head.

  3. Ваша команда grep будет найти и указанную программу, и Программа grep.

  4. Вы используете xargs, чтобы предоставить один аргумент командной строки. Либо backticks, либо $() - лучший выбор.

  5. top принимает переключатель -p, а не переключатель -pid. (По крайней мере, на моем компьютере.)

Добавление все это, попробуйте:

$ top -p $(ps aux | awk '/ProgramName/ && ! /awk/ { print $2; exit; }') 
+0

mh, это не работает. «-pid» - это действительно мой вариант, а не «-p» – anonymous1fsdfds

+0

Это интересно. Какое распределение Linux вы используете, и какая версия 'top' (run' top -v')? –

+0

Если вы укажете '-pid' вместо' -p', но в противном случае используйте команду, которую я предложил, она работает? –

2

Ваша проблема

  1. агд к вершине должен быть "-p" не "-pid"
  2. xargs предназначен для запуска неинтерактивных программ

Попробуйте это :

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

или

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

или

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

+1 для 'pgrep'. Я этого раньше не видел. –

+0

my top принимает «-pid» как вариант, а не «-p», и у меня нет «pgrep» в моей системе, но спасибо за ответ в любом случае! – anonymous1fsdfds