Как передать вывод grep в «lsof -p»?

Как передать вывод grep в «lsof -p»?

Я хочу знать путь, по которому сейчас бегу./a.out

Существует несколько процессов MPI, но мне нужен только один из PID нескольких ./a.out. Поэтому я сначала использую следующий код для его grep:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1

что дает один PID, например 12345.

Теперь я хочу использовать:

lsof -p12345 

Чтобы узнать путь к файлу PID 12345.

Как объединить два шага в одну командную строку?

решение1

Вот команда, которая вам нужна:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p

Главное здесь вот в чем xargs.

Такие команды, как grepи awkмогут приниматьстандартный ввод(STDIN) в качестве параметра или аргумента с использованием канала. Однако другие, такие как cp, echoи lsofигнорируют стандартный поток ввода и полагаются исключительно нааргументынаходится после команды.

Используя командуxargsвы можете создавать и выполнять командные строки из стандартного ввода.

решение2

Я бы рекомендовал использовать, xargsкогда команда возвращает несколько строк (или записей). В этом случае команда возвращает один PID и функцию оболочки, известную какзамена командыбыло бы подходящим решением.

Это позволяет использовать вывод одной команды в другой и достигается путем заключения команды, которая предоставляет ввод, в $(и ). Раньше использовались обратные кавычки (`), но теперь они не рекомендуются.

lsof -p $(ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1)

решение3

Ваша первая сложная команда для поиска PID на основе имени может быть заменена pgrep, например, на

$ pgrep -nf a.out
70512

Затем, чтобы получить путь из lsof, можно использовать условную печать в awk.

Таким образом, команда может быть такой:

$ lsof -p $(pgrep -nf a.out) | awk '$4 == "cwd" {print $9}'

Вышеизложенное основано на следующем lsofвыводе:

$ lsof -p $(pgrep -nf a.out)
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
gsleep  70513 kenorb  cwd    DIR    1,4      1938 121793972 /my/path

Связанный контент