Eu 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 específico aberto no Linux? De preferência, um tipo de uma linha ou uma solução específica de ferramenta Linux seria ideal.
if [
fusor "$ file" `]; então exit`ls
seguir - retorna o código de saída 2 se houver um erro (por exemplo, opção inválida especificada) ou arquivo não encontrado (e 0 se relatar informações com êxito).Na maioria dos sistemas Linux,
lsof NAME
o trabalho é:fonte
cwd
linhas (que relatam usar como o diretório de trabalho atual de um processo) apenas reportam diretórios.Ter um arquivo aberto não é um bloqueio, porque, se cada processo precisar verificar se o arquivo está aberto primeiro e não continuar se estiver, ou criar / abrir se não estiver, dois processos poderão verificar simultaneamente, ambos encontrarão que não está aberto, crie-o 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 no modo somente leitura e removendo-o para desbloquear. Se o arquivo existir (e for somente leitura), a criação do arquivo falhará, portanto você poderá verificar e bloquear 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
Isso também grava o processo de propriedade 'PID no arquivo, o que resolve seu outro problema:umask
uma configuração por processo que define as permissões com as quais os novos arquivos são criados:cat /var/lock/foo
No que diz respeito à pergunta específica "Quais processos têm esse arquivo aberto?", Isso pode ser útil quando você deseja desmontar um sistema de arquivos, mas não pode porque alguns processos têm um arquivo aberto. Se você não possui esses comandos disponíveis, 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$'
fonte
Se você deseja saber qual descritor de arquivo do processo exato está vinculado ao seu arquivo sem
lsof
oufuser
- pesquise por/proc
:Substitua
$1
pelo nome do arquivo aberto que você está procurando. Você pode alterar o-printf
que você deseja ver ou canalizaregrep -o '[0-9]+' | head -1
para usar nas informações desse processo.ps -Fp <pid>
A resposta de @fin é a melhor resposta, obviamente, mas para responder ao comentário de @ JoseLSegura , se não estiver disponível, a solução acima foi minha resposta.
$ lsof <filename>
fonte
Eu descobri que o uso da resposta aceita não listou os processos que estavam usando meu diretório (ubuntu 14.04).
No final, usei lsof (listar arquivos abertos) e dei uma olhada em sua saída para encontrar o processo incorreto:
fonte
lsof
é a sua opção-R
. por exemplo:lsof -R [filename]