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

1

Eu quero saber o caminho da execução atual de ./a.out

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

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

que dá um pid, por exemplo 12345

Agora eu quero usar

lsof -p12345 

para conhecer o caminho do arquivo do PID 12345

Como combinar as duas etapas em uma linha de comando?

    
por user15964 18.04.2016 / 10:36

3 respostas

3

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 grep e awk podem aceitar a entrada padrão ( STDIN) como um parâmetro ou argumento usando um pipe. No entanto, outros, como cp , echo e lsof , desconsideram o fluxo de entrada padrão e dependem exclusivamente dos argumentos encontrados após o comando.

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

    
por 18.04.2016 / 10:42
1

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

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

Então o comando poderia ser:

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

Acima é baseado no seguinte lsof output:

$ 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
    
por 18.04.2016 / 10:58
1

Eu recomendaria usar xargs quando um comando retorna várias linhas (ou registros). Nesse caso, o comando retorna um único PID e um recurso de shell conhecido como substituição de comando seria uma solução apropriada.

Isso permite que a saída de um comando seja usada por outro e é realizada agrupando o comando que fornece a entrada em $( e ) . No passado, backticks (') foram usados, mas eles não são mais recomendados.

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