
Я хочу знать путь, по которому сейчас бегу./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