Como passar a saída do grep para “lsof -p”?

Como passar a saída do grep para “lsof -p”?

Quero saber o caminho da execução atual./a.out

Existem vários processos MPI, mas preciso apenas de um dos PID de vários arquivos ./a.out. Então, primeiro uso o código abaixo para fazer o grep:

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

que fornece um PID, por exemplo 12345.

Agora quero usar:

lsof -p12345 

Para saber o caminho do arquivo PID 12345.

Como combinar as duas etapas em uma linha de comando?

Responder1

Este é o comando que você precisa:

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

A chave aqui é xargs.

Comandos como grepe awkpodem aceitar oentrada padrão(STDIN) como parâmetro ou argumento usando um canal. No entanto, outros, como cp, echoe lsofdesconsideram o fluxo de entrada padrão e dependem apenas doargumentosencontrado após o comando.

Usando o comandoxargsvocê pode construir e executar linhas de comando a partir da entrada padrão.

Responder2

Eu recomendaria usar xargsquando um comando retornar várias linhas (ou registros). Neste caso, o comando retorna um único PID e um recurso de shell conhecido comosubstituição de comandoseria uma solução adequada.

Isso permite que a saída de um comando seja usada por outro e é feito agrupando o comando que fornece a entrada em $(e ). No passado, eram usados ​​​​crases (`), mas não são mais recomendados.

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

Responder3

Seu primeiro comando complexo para encontrar o PID com base no nome pode ser substituído por pgrep, por exemplo

$ pgrep -nf a.out
70512

Então, para obter o caminho de lsof, você pode usar impressão condicional em awk.

Então o comando poderia ser:

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

Acima é baseado na seguinte lsofsaída:

$ 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

informação relacionada