Para que servem os arquivos pid e lock?

75

Costumo ver que os programas especificam arquivos pid e lock. E não tenho muita certeza do que eles fazem.

Por exemplo, ao compilar nginx:

--pid-path=/var/run/nginx.pid \
--lock-path=/var/lock/nginx.lock \

Alguém pode lançar alguma luz sobre este?

Stann
fonte

Respostas:

86

Os arquivos pid são gravados por alguns programas para registrar sua identificação de processo enquanto eles estão iniciando. Isso tem vários propósitos:

  • É um sinal para outros processos e usuários do sistema que esse programa específico está sendo executado, ou pelo menos iniciado com êxito.
  • Ele permite escrever um script realmente fácil de verificar se está sendo executado e emitir um killcomando simples se alguém quiser finalizá-lo.
  • É uma maneira barata de um programa verificar se uma instância anterior em execução não foi encerrada com êxito.

A simples presença de um arquivo pid não garante que esse ID de processo específico esteja sendo executado, é claro, portanto esse método não é 100% infalível, mas "bom o suficiente" em muitos casos. Verificar se existe um PID específico na tabela de processos não é totalmente portátil em sistemas operacionais UNIX, a menos que você queira depender do psutilitário, que pode não ser desejável chamar em todas as instâncias (e acredito que alguns sistemas operacionais UNIX de psmaneira diferente).

Os arquivos de bloqueio são usados ​​pelos programas para garantir que duas instâncias (bem comportadas) separadas de um programa, que podem estar em execução simultaneamente em um sistema, não acessem outra coisa ao mesmo tempo. A idéia é antes que o programa acesse seu recurso, verifique a presença de um arquivo de bloqueio e, se o arquivo de bloqueio existir, dê um erro ou espere que ele desapareça. Quando ele não existe, o programa que deseja "adquirir" o recurso cria o arquivo e, em seguida, outras instâncias que podem aparecer mais tarde aguardam a conclusão desse processo. Obviamente, isso pressupõe que o programa "adquirindo" o bloqueio realmente o libere e não esqueça de excluir o arquivo de bloqueio.

Isso funciona porque o sistema de arquivos em todos os sistemas operacionais do tipo UNIX impõe a serialização , o que significa que apenas uma alteração no sistema de arquivos acontece a qualquer momento. Mais ou menos como bloqueios com bancos de dados e tal.

LawrenceC
fonte
1
Isso está correto, a menos que o arquivo de bloqueio seja excluído manualmente. O VMWare Player exibe esse comportamento, por exemplo, se o VMWare Player travar, você deverá excluir um .lckarquivo no diretório da VM, caso contrário, ele informará que está em uso quando você tentar iniciá-lo.
LawrenceC
1
E o Windows? Como ele lida com arquivos .lock? Afinal, não é parecido com o Unix.
SarahofGaia 15/09/2015
2
Não acho que seja comum os programas Windows funcionarem dessa maneira. Os únicos programas com este comportamento que eu vi são portas de Unix / Linux
hamster
2
LawrenceC, Re " Quando não existe, o programa que deseja" adquirir "o recurso cria o arquivo "; Mas existem funções apropriadas criadas especificamente para fazer essa sincronização. Por que não confiar nessas funções em vez de usar o "arquivo hack"?
Pacerier
1
@Pacerier - Os arquivos de bloqueio dessa maneira provavelmente são usados ​​com mais frequência por coisas como scripts de shell ou programas que podem interagir com scripts de shell, já que os shells Unix / Linux interagem com o sistema de arquivos com muita facilidade, em comparação com outras primitivas de sincronização. Os arquivos também persistem facilmente em processos diferentes. Um programa de alto desempenho, obviamente, provavelmente prefere as primitivas do SO nativo versus os arquivos para sincronizar as coisas internamente ou mesmo contra outros processos que não são shells.
LawrenceC
14

Esses arquivos geralmente são usados ​​por daemons que devem ser executados apenas uma vez em um sistema. O arquivo PID geralmente contém o número de identificação do processo do programa já iniciado e em execução, se houver. Além disso, quando é iniciado, ele cria o arquivo de bloqueio. Enquanto o arquivo de bloqueio existir, ele não iniciará outro sem a intervenção do usuário. Se o arquivo de bloqueio existir e o ID do processo mencionado no arquivo pid não estiver em execução, o daemon será considerado "morto", o que significa que ele deve estar em execução, mas provavelmente não se deve a uma falha ou ao desligamento inadequado. . Isso pode iniciar um cenário especial de inicialização / reinicialização para alguns programas. Desligá-lo corretamente removerá o arquivo de bloqueio.

Caleb
fonte
+1 Explicando o uso de ter o arquivo de bloqueio e o arquivo pid.
Kyle Krull
@ Caleb - Explique por que tanto um arquivo PID quanto um arquivo de bloqueio seriam usados. Parece que um arquivo PID seria suficiente. Se o arquivo PID existir, o PID poderá ser verificado para verificar se o processo está em execução, basta executar menos etapas do que verificar um arquivo de bloqueio, verificar um arquivo PID e verificar a existência do processo.
precisa saber é
@MVaughan Para evitar condições de corrida, se nada mais. Alguns aplicativos têm usos para momentos em que ainda precisam do PID, mas podem abrir mão do bloqueio. Porém, em um nível mais fundamental, se você sobrecarregar um arquivo para ambas as operações, abrirá a porta para falhas como uma falha, deixando um estado inconsistente no sistema.
Caleb
8

Um arquivo PID conterá o ID do processo de um processo em execução. Isso tem vários usos; você pode lê-lo e verificar se o processo ainda está em execução, tomar as ações apropriadas ou lê-lo e encerrar o processo.

Um arquivo de bloqueio provavelmente é específico do aplicativo. Os arquivos de bloqueio são usados ​​para indicar que algum recurso está em uso e que o processo que deseja acessar deve esperar até que o recurso seja liberado antes de continuar.


fonte