2013-12-13 7 views
3

Моя цель состояла в том, чтобы найти процесс с большим числом PID (да, я знаю, может просто сделать ps -ef|tail -n 1, но сначала я хочу найти PID, а затем найти процесс), поэтому я использовал следующую команду: найти процесс с самым высоким PID: ps -ef|cut -d " " -f 6|sort|tail -n 1 , а затем я нахожу ps -p, который получает самый высокий PID и выводит процесс сопоставления (который работает при копировании PID вручную), но по какой-то причине, когда я помещаю '|' между ними, он говорит ошибка синтаксиса. может ли кто-нибудь указать, в чем проблема? addtionally, если у вас есть лучший способ этой вещи, опубликуйте его.Linux Command - 'ps'

Tnx, Дин

пс, полная команда, которая не работает в: ps -ef|cut -d " " -f 6|sort|tail -n 1|ps -p.

ответ

4

Существует разница между предоставлением аргумента для программы и записью стандартного ввода программы, который вы делаете.

В первом случае программа считывает список аргументов в виде массива строк, который может быть интерпретирован программой. Во втором случае программа по существу считывает из специального файла и обрабатывает его содержимое. Все, что вы ставите после имени программы, являются аргументами. ps ожидает много возможных аргументов, например -p и PID процесса. В вашей команде вы не предоставляете PID в качестве аргумента, скорее пишите в stdin из ps, который он игнорирует.

Но вы можете использовать xargs, который считывает стандартный ввод и использует его в качестве аргументов команды:

ps -ef | cut -d " " -f 6 | sort | tail -n1 | xargs ps -p 

Это то, что xargs делает (от man):

xargs - build and execute command lines from standard input 

Или вы может использовать замена команды, as janos показывает. В этом случае оболочка вычисляет выражение внутри $() как команду и вместо этого выводит свой вывод. Итак, после того, как произойдет расширение, ваша команда выглядит как ps -p 12345.

man bash:

Command Substitution 
    Command substitution allows the output of a command to replace the com‐ 
    mand name. There are two forms: 

      $(command) 
    or 
      `command` 

    Bash performs the expansion by executing command and replacing the com‐ 
    mand substitution with the standard output of the command, with any 
    trailing newlines deleted. Embedded newlines are not deleted, but they 
    may be removed during word splitting. The command substitution $(cat 
    file) can be replaced by the equivalent but faster $(< file). 
+0

Можете ли вы расширить о обеих системах, а также о подстановки команд? – user2559696

+0

@ user2559696 Там вы идете, я попытался добавить немного больше деталей. –

+0

Альтернативно, если ваша команда ps поддерживает опцию -o, вы можете указать, какой столбец будет печататься. Например, «ps -eo pid» будет печатать PID, «ps -eo pid, ppid» будет печатать как PID, так и PPID. С помощью этой опции вам не нужно будет вырезать вывод ps. Еще одно замечание. Ваш скрипт начнется с высокого PID и процессов, которые он запускает.Ваш вывод может захватить эти PID вместо фактического процесса, который вы хотите захватить. – alvits

3

Может быть, вы ищете это:

ps -p $(ps -ef | cut -d " " -f 6 | sort | tail -n 1) 

То есть ps -p PID печатает детали PID, указанный в командной строке. Он не может принимать свой параметр со стандартного ввода.

Или вы можете использовать xargs, как Lev Levitsky показывает ;-)