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
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.
find
comando comps
?