Captura quando o processo java foi finalizado

Como posso pegar quando alguém mata meu aplicativo (java, mas não é importante) pelo gerenciador de tarefas ou pelo comando de console taskkill?

Eu entendo que eu não posso pegar isso no meu aplicativo, mas talvez eu possa fazer isso por algum gancho com o sistema operacional (janelas, claro). Talvez biblioteca easyhook ( http://www.codeplex.com/easyhook ) pode me ajudar, mas não consigo encontrar exemplos lá. Nosso aplicativo frequentemente morria nos servidores dos clientes e eu só queria saber quem (ou o quê) o mata. Temos certeza de que não é problema do aplicativo, parece que o processo java.exe foi morto do gerenciador de tarefas

Você consegue fazer isso:

Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { // run some code } }); 

Se a VM falhar no código nativo, isso não será chamado. Também não será chamado se a VM for interrompida. Não te diz por que está fechando também. Consulte o design da API de ganchos de desligamento . Eu não acho que você pode obter mais informações do que isso.

Muitas vezes, no passado, usei o Java Service Wrapper . É um processo separado que inicia e reinicia os processos Java e registra a saída deles, o que pode ser útil se exceções inesperadamente matarem o processo.

Você pode fazer simplesmente por aplicativo java também, usando dois aplicativos. É assim que é feito em muitos sistemas de produção java puro

  1. Seu aplicativo principal fará o arquivo .lock em um local padrão e o bloqueará exclusivamente.
  2. Seu outro programa (talvez chamá-lo de aplicativo zelador) continuará fazendo uma chamada lock () e continuará esperando.

  3. Quando a chamada de bloqueio retornar, você pode ter certeza de que seu aplicativo principal está encerrado. Agora você pode determinar.

    Quanto à questão “Por que o aplicativo é morto”, tecnicamente não é possível descobrir (talvez 1 ou 2 cenários, mas nem todos os cenários), AFAIK.

você pode usar um segundo aplicativo que será executado na máquina local e monitorar seu aplicativo principal. quando o aplicativo principal desce, ele pode fazer alguma coisa (por exemplo, reiniciá-lo, registrar o evento) c

Não existe uma maneira (padrão) de descobrir quando seu aplicativo é eliminado pelo gerenciador de tarefas com o Java.

A abordagem usual é ter uma segunda aplicação que inicie a aplicação principal como um processo filho (use ProcessBuilder ). O invólucro notará quando a criança morrer. Por todos os motivos usuais de finalização, defina um código de saída via System.exit() em seu aplicativo principal. Em seu wrapper, verifique o código de saída. Se não é um que você definiu explicitamente, alguém matou o aplicativo ou ele caiu devido a um bug da VM.

Para distinguir esses dois, verifique a saída do aplicativo filho e procure por despejos de memory de falhas da VM no diretório atual (seja lá o que for para o seu aplicativo; geralmente é o diretório em que o aplicativo foi instalado).