Questão Como posso determinar qual processo tem um arquivo aberto no Linux?


Gostaria de determinar qual processo possui a propriedade de um arquivo de bloqueio. Os arquivos de bloqueio são simplesmente um arquivo com um nome específico que foi criado.

Então, como posso determinar qual processo tem um arquivo particular aberto no Linux? De preferência, um tipo de linha única ou uma solução de ferramenta Linux específica seria ideal.


112


origem




Respostas:


Você também pode usar fuser por esta:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

49



isso foi ótimo, mas para usá-lo em um script eu tive que verificar o comprimento de saída. - chovy
O que você quer dizer com o comprimento de saída? - Nathan Fellman
if [ fusor "$ file" `]; então sair - chovy
O fusor tem um comportamento estranho com códigos de saída. ele retorna 1 exitcode com dois estados: A / algum erro interno, arquivo verificado não encontrado etc, processo B / no abriu o arquivo especificado. Na situação A / alguma mensagem de erro é impressa em sua saída. Infelizmente quando o arquivo está disponível e é aberto por algo, a saída é gerada, mas com o código de saída 0. Seria melhor se o fusor saísse com três códigos, não dois como atualmente. O lsoft é um pouco pior, porque isso está funcionando mais devagar. - Znik
Este é essencialmente o mesmo padrão que ls follows - retorna o código de saída 2 se houver um erro (por exemplo, uma opção inválida especificada) ou arquivo não encontrado (e 0 se ele relata informações com sucesso). - Scott


Na maioria dos sistemas Linux lsof NAME faz o trabalho:

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

133



E se você não tiver lsof? - JoseLSegura
@JoseLSegura: Presumo que você seja engenhoso o suficiente para a resposta 'então instale o lsof' para ser inútil para você. Você pode elaborar sobre o seu problema? Se você não tem root, provavelmente não tem privs para descobrir se outro usuário tem o arquivo aberto de qualquer maneira. - Michael Scheper


Ter um arquivo aberto não é um bloqueio porque, se cada processo tiver que verificar se o arquivo está aberto primeiro e não prosseguir se estiver ou criá-lo / abri-lo se não estiver, então dois processos podem ser verificados simultaneamente, ambos encontram que não está aberto, então crie ou abra-o.

Para usar um arquivo como um bloqueio, a operação de verificação e bloqueio deve ser uma única operação ininterrupta. Você pode conseguir isso em um sistema de arquivos Unix criando um arquivo com o modo somente leitura e removendo-o para desbloquear. Se o arquivo existir (e for somente leitura), a criação do arquivo falhará, assim você obtém o recurso de verificação e bloqueio em uma única operação atômica.

Se o seu processo de bloqueio for um script de shell que será executado como um daemon, você poderá obter esse efeito usando umask, uma configuração por processo que define as permissões com as quais novos arquivos são criados:

oldumask = $ (umask)
umask 222 # criar arquivos unwritable to owner too
if echo $$> / var / lock / foo
então
    : bloqueio sucedido
outro
    : falha no bloqueio
fi
umask $ oldumask
Isso também grava o processo de propriedade 'PID no arquivo, que resolve seu outro problema: cat /var/lock/foo
No que diz respeito à pergunta específica "Que processos têm este arquivo aberto?", Isso pode ser útil quando você deseja desmontar um sistema de arquivos, mas não pode, porque algum processo tem um arquivo aberto nele. Se você não tem esses comandos disponíveis, você pode perguntar /proc como root:

ls -l /proc/*/cwd | grep '/var/lock/foo$'

ou, como usuário mortal:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


8



o método `ls -l 'funciona para o Linux, mas parece não estar funcionando para o CygWin: não há informações sobre o bloqueio de arquivos. Você não sabe como resolver? Obrigado. - Sopalajo de Arrierez
Não, você não cria um arquivo somente leitura para um bloqueio, porque quando seu aplicativo falhar, o arquivo ainda estará lá. Forçando o usuário a esclarecer a porcaria depois que seu aplicativo caiu é mental. - polkovnikov.ph


Se você quiser saber quais links de descritor de arquivo do processo exato para o seu arquivo sem lsof ou fuser - pesquisar /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

Substituir $1 com o nome de arquivo aberto que você está procurando. Você pode alterar o -printf para o que você quiser ver ou canalizar egrep -o '[0-9]+' | head -1 para usar com ps -Fp <pid> para as informações desse processo.

o $ lsof <filename> resposta por @fin é a melhor resposta, obviamente, mas para responder @ Comentário de JoseLSegura, se isso não estiver disponível, a solução acima foi minha resposta.


3





Eu achei que usando a resposta aceita não listei os processos que estavam usando o meu diretório (Ubuntu 14.04).

No final, usei o lsof (listar arquivos abertos) e ajudei a saída para encontrar o processo problemático:

lsof | egrep "<regexp-for-your-file>"

1