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 umask
uma configuração por processo que define as permissões com as quais os novos arquivos são criados:
oldumask = $ (umask)
umask 222 # também cria arquivos graváveis para o proprietário
se eco $$> / var / lock / foo
então
: bloqueio bem-sucedido
outro
: bloqueio falhou
fi
umask $ oldumask
Isso também grava o processo de propriedade 'PID no arquivo, o que resolve seu outro problema:
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$'