Como saber que um processo java foi encerrado, mas reiniciado com um novo pid?

3

Eu configurei um serviço systemd para um aplicativo java. Tudo está funcionando bem até que o aplicativo java se reinicie. Ao reiniciar, o processo java principal observado pelo systemd sai com o status 0 e inicia uma nova instância de si mesmo. O Systemd agora acha que o processo foi encerrado.

Como posso informar ao systemd o novo PID do processo iniciado pelo aplicativo java de reinicialização?

Como faço para obter o PID do processo recém-lançado?

O serviço systemd é definido da seguinte forma:

[Unit]
Description=MyJavaApp
After=network.target

[Service]
Type=simple
User=myuser
ExecStart=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar &
ExecStop=/usr/bin/java -jar -Djava.awt.headless=true /opt/MyJavaApp/MyJavaApp.jar -quit

[Install]
WantedBy=multi-user.target
    
por Basti Destruction 06.05.2017 / 21:09

1 resposta

2

Infelizmente você não pode. Com type=simple , o systemd rastreia o processo executado diretamente pelo parâmetro ExecStart . Embora type=forking ainda tivesse um problema semelhante, nesse sistema iria acompanhar o processo, e assim que ele sair, o systemd pensará que ele está morto.

A dificuldade com isso é que o systemd não tem como saber que esse é o comportamento normal da sua aplicação. Pode ser que seu aplicativo tenha um processo mestre e, em seguida, gera processos de trabalho filho. E assim, o sistema pensaria que seu mestre morreu e deixou algumas crianças por perto que precisam ser limpas.

Existem 2 maneiras de resolver isso:

  1. De alguma forma, crie um processo de monitoração que o systemd execute, e esse processo inicia seu aplicativo. Então, de alguma forma, esse processo de monitoramento será capaz de dizer a diferença entre a saída do aplicativo e a saída do fork. Isso pode ser bastante difícil de implementar, pois não é fácil acompanhar os filhos de um processo infantil.
    Uma maneira que poderia funcionar seria criar um pipe anônimo, passar a extremidade de gravação do pipe para o processo e aguardar EOF no final de leitura dele. Contanto que seu aplicativo não feche descritores de arquivos desconhecidos, ele deve funcionar.
  2. Altere seu aplicativo para usar exec em vez de fork + exec . Desta forma, o novo processo usa o mesmo PID que o processo antigo.
por 07.05.2017 / 05:32