1

Я хочу знать путь в настоящее время работает ./a.out

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

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

который дает один пид, например, 12345

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

lsof -p12345 

знать путь к файлу PID 12345

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

3 ответа3

3

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

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

Ключ здесь - xargs .

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

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

1

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

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

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

Ваша первая сложная команда для поиска 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .