Você pode tentar 2 soluções:
fuser /path/to/opened/file
ou
lsof /path/to/opened/file
Algo parecido com isto:
PID=3187: /home/morganc/test1.out
Como eu uso o comando find para que ele liste o número PID do meu arquivo test1.out, bem como o diretório de onde ele está localizado?
Obrigado antecipadamente.
Você pode tentar 2 soluções:
fuser /path/to/opened/file
ou
lsof /path/to/opened/file
Se você é o proprietário do processo que criou ou tem o arquivo aberto, você 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 tem muitos processos em execução, apenas olhe manualmente para a saída. Amostra: procurando pelo processo que possui vmstat.out
open:
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
Assim, o PID 27737
tem o arquivo vmstat.out
open e o caminho completo é /home/oracle/log/vmstat.out
Se você quiser filtrar a maior parte da saída, tente o seguinte:
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, em seguida, procure o PID logo acima do arquivo de interesse.
Portanto, para ignorar os outros processos, canei para o awk, salvando a linha anterior e imprimindo a linha anterior quando encontrei a linha atual iniciada 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
Dependendo de como eu interpreto sua pergunta (veja os 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 realizar sua pesquisa, e $file_name
como o nome do arquivo para o qual você está procurando.
A primeira alternativa se for para o caso de procurar 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 comando less
, pressionei C-z
para pará-lo, coloquei em segundo plano e executei find /usr/bin -name less -exec pidof {} \;
. Para testar a segunda alternativa, criei um arquivo de dados ~/test.txt
, ran less ~/test.txt
, depois C-z
, seguido de find ~ -name test.txt -exec fuser {} \;
.