Como executar exatamente 1 instância de um programa como um processo? Ou, alternativamente, como testar a existência de um programa em execução?
Métodos portáteis são os preferidos.
Como executar exatamente 1 instância de um programa como um processo? Ou, alternativamente, como testar a existência de um programa em execução?
Métodos portáteis são os preferidos.
Pode-se testar a capacidade de escrita de um pipe (nomeado) e, com programação apropriada, a existência de uma instância de um programa em execução.
Suponha que reservamos um nome de arquivo
/tmp/fifo-myapp
como o nome de um arquivo FIFO (ele deve ser personalizado para cada aplicativo diferente; geralmente reside em alguma pasta específica do aplicativo e é especificado como um caminho absoluto):Arquivo1:
test-wr-fifo
Este programa será encerrado com status não bem-sucedido quando o fifo não estiver aberto e o tempo limite especificado for atingido.
Arquivo2:
single-inst-prog
Este é o programa para o qual queremos apenas 1 instância.
Para invocar
single-inst-prog
:Este método funciona porque a abertura de uma extremidade de um FIFO bloquearia (quando O_NONBLOCK estiver limpo) até que a outra extremidade também esteja aberta; esse método também funciona porque não estamos lendo ou gravando nenhum dado no FIFO, portanto, a condição EOF e o SIGPIPE nunca são sinalizados.
Sempre desconfio de condições de corrida com arquivos de bloqueio, então uso um arquivo nomeado específico e uso
mv
porque é atômico.Normalmente, o processo usa um nome de arquivo permanente como
/tmp/locks/myProcess.lock
. Qualquer processo que deseje adquirir o bloqueio tenta alterar o nome para/tmp/locks/myProcess.lock.myPID
(usandomv(1)
para shell erename(2)
para C). Ele pode então verificar se seu nome privado já existe. Caso contrário, ele entra em loop/dormência conforme apropriado.Com alguns cuidados, é possível que o processo anexe um log ao arquivo de bloqueio: quando ele tentou bloquear pela primeira vez, quando conseguiu, quando foi liberado.
Obviamente, ele deve se lembrar da hora da primeira tentativa, pois só pode registrar isso depois de ser bem-sucedido. Ele também pode vigiar atrasos excessivos e gerar um alerta para investigação (presumivelmente, outra cópia do processo falhou e não teve um onExit para liberar o bloqueio).
Aqui está um exemplo com um xmessage. Não tenho certeza se está tudo bem para você, mas você pode tentar.