grep의 출력을 "lsof -p"에 전달하는 방법은 무엇입니까?

grep의 출력을 "lsof -p"에 전달하는 방법은 무엇입니까?

현재 실행중인 경로를 알고 싶습니다../a.out

여러 MPI 프로세스가 있지만 여러 ./a.out. 그래서 먼저 아래 코드를 사용하여 grep합니다.

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

이는 하나의 PID(예: 12345)를 제공합니다.

이제 다음을 사용하고 싶습니다.

lsof -p12345 

PID 12345의 파일 경로를 알고 싶습니다.

2단계를 하나의 명령줄로 결합하는 방법은 무엇입니까?

답변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

관련 정보