Algo assim:

PID = 3187: / home / morganc / test1.out

Como utilizo o comando find para que liste o número PID do meu arquivo test1.out, bem como o diretório de onde está localizado?

Agradecemos antecipadamente.

Comentários

  • tem certeza de que não está confundindo find comando com ps?
  • Se o processo que criou ou tem o arquivo aberto ainda estiver em execução, a resposta de Gilles funcionará. o processo que criou o arquivo não está mais em execução, então não há como descobrir o que aconteceu no passado.
  • Como seu arquivo obteve um PID?

Resposta

Você pode tentar 2 soluções:

fuser /path/to/opened/file 

ou

lsof /path/to/opened/file 

Resposta

Se você for o proprietário do processo que criou ou está com o arquivo aberto, vocês pode fazer

ls -o /proc/*/fd 2> /dev/null 

que listará todos os arquivos para PIDs para seu ID de usuário; se você não tiver muitos processos em execução, basta olhar manualmente a saída. Exemplo: procurar o processo que está vmstat.out aberto:

mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null /proc/27669/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history /proc/27737/fd: total 0 lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0 lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0 lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify 

Portanto, PID 27737 tem o arquivo vmstat.out aberto e o caminho completo é /home/oracle/log/vmstat.out

Se você deseja filtrar a maior parte da saída, tente isto:

mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E "(^/proc|vmstat.out)" /proc/27669/fd: /proc/27943/fd: lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out /proc/28047/fd: /proc/28048/fd: /proc/self/fd: mark (/home/oracle/log)> 

E então procure o PID logo acima do arquivo de interesse.

Então, para ignorar os outros processos, eu canalizei para awk, salvando a linha anterior e imprimindo a linha anterior quando descobri que a linha atual começava com um l:

ls -l /proc/*/fd 2> /dev/null | \ grep -E "(^/proc|vmstat.out)" | \ awk "BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev $NF }" /proc/27943/fd:/home/oracle/log/vmstat.out 

Resposta

Dependendo dependendo de como eu interpreto sua pergunta (ver comentários), sua solução seria:

find $root_dir -name $file_name -exec pidof {} \; 

ou:

find $root_dir -name $file_name -exec fuser {} \; 

Onde você define a variável $root_dir como o diretório inicial abaixo do qual você deseja para realizar sua pesquisa, e $file_name como o nome do arquivo que você está procurando.

A primeira alternativa se para o caso de pesquisa de um arquivo executável sendo executado, e a segunda alternativa é para o caso de um arquivo de dados sendo executado por um executável.

Para testar isso (para a primeira alternativa), abri um arquivo usando o less comando, pressionado C-z para interrompê-lo e colocá-lo em segundo plano e executou find /usr/bin -name less -exec pidof {} \;. Para testá-lo para a segunda alternativa, criei um arquivo de dados ~/test.txt, executei less ~/test.txt e, em seguida, C-z, seguido por find ~ -name test.txt -exec fuser {} \;.

Comentários

  • E se 20 pessoas estivessem concorrendo less no momento? Eu acho que o OP quer um nome de arquivo de saída para procurar.
  • Eu entendi que a questão era uma busca pelo uso de um executável, não um arquivo de dados, então no seu caso, ele obteria vinte pids e um único caminho. No entanto, vejo como você está interpretando a pergunta de maneira diferente, então ' adicionarei uma segunda solução em minha resposta para cobrir seu caso, obrigado.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *