
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 grep
e awk
podem aceitar oentrada padrão(STDIN) como parâmetro ou argumento usando um canal. No entanto, outros, como cp
, echo
e lsof
desconsideram o fluxo de entrada padrão e dependem apenas doargumentosencontrado após o comando.
Usando o comandoxargs
você pode construir e executar linhas de comando a partir da entrada padrão.
Responder2
Eu recomendaria usar xargs
quando 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 lsof
saí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