Como usar o comando find para obter o PID do arquivo e onde ele está localizado?

3

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.

    
por Thomas 13.02.2018 / 19:43

3 respostas

1

Você pode tentar 2 soluções:

fuser /path/to/opened/file

ou

lsof /path/to/opened/file
    
por 13.02.2018 / 19:46
1

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
    
por 13.02.2018 / 20:03
1

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 {} \; .

    
por 13.02.2018 / 20:15