Tenho um script que executa um programa que desejo executar apenas como uma instância por script. Por exemplo, tenho um script "a" e um script "b", cada um executando um programa Java. Quero que apenas uma instância do programa Java seja executada a partir do script "a" e apenas uma instância seja executada a partir do script "b". Nesse caso, não posso simplesmente testar se um executável específico está em execução, porque é a JVM. O próprio script também é encerrado após o início do aplicativo, então não posso testar para ver se ele já está em execução.
Posso gravar o PID do processo em execução em um arquivo e testar, mas estou entrando em uma condição de corrida, pois preciso esperar o programa iniciar e então registrar o PID em um arquivo. Se o script de inicialização for executado mais de uma vez muito rápido, acabo com várias instâncias do programa em execução. Há também a rara ocasião em que duas instâncias tentam gravar no arquivo PID ao mesmo tempo, criando outro problema, em que agora tenho um processo órfão do qual não tenho nenhum registro PID.
Qual é um método confiável para bloquear um programa dentro de um script de inicialização, de modo que eu execute apenas uma única instância de um script sem uma condição de corrida?
Observe que isso não se limita especificamente à execução de programas Java. Este foi apenas um exemplo.