El proceso Unix/Java deja de ejecutarse cuando se mueve al fondo

El proceso Unix/Java deja de ejecutarse cuando se mueve al fondo

Tenemos un proceso Java que se creó usando Appassembler. Funciona bien siempre que se inicie y se ejecute en primer plano:

[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit

Luego podremos acceder y probar la aplicación con éxito. Sin embargo, si lo iniciamos en segundo plano, no sólo deja de ejecutarse, sino que parece que no podemos reactivarlo sinllevándolo al primer plano:

[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$ bin/ourapp &
[1] 11661
Starting in APP_HOME=/home/ec2-user/app_home
Press Q to quit
                                                     ## Not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  jobs
[1]+  Stopped                 bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  bg %1
[1]+ bin/ourapp &                                    ## Still not accessible!
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  jobs
[1]+  Stopped                 bin/ourapp
[ec2-user@ip-xxx ourapp-0.0.1-SNAPSHOT]$  fg %1
bin/ourapp                                           ## Now, it's accessible.

¿Lo estoy iniciando incorrectamente? ¿Hay alguna manera de mantener el trabajo en ejecución, aunque esté en segundo plano? Necesito iniciar esto como un proceso demonio nohupy luego cerrar sesión, pero parece que no puedo mantenerlo funcionando correctamente a menos que siga siendo el proceso en primer plano, lo cual no es factible.

Respuesta1

Parece que hay trabajos en segundo plano esperando entradaestan detenidosen la mayoría de los entornos.

Desde elPágina de Wikipedia sobre control de trabajos de Unix:

Un proceso en segundo plano que intenta leer o escribir en su terminal de control recibe una señal SIGTTIN (para entrada) o SIGTTOU (para salida). Estas señales detienen el proceso de forma predeterminada, pero también pueden manejarse de otras maneras.

Y de unPágina de Rutgers sobre el uso intermedio de Unix:

Un trabajo que se ejecuta en segundo plano se detendrá si necesita información. No se pueden proporcionar entradas a un trabajo en segundo plano, así que asegúrese de que todas las entradas necesarias estén disponibles para él.

Como soluciónsimplemente actualizamos nuestro proceso Java para aceptar un argumento opcional que hará que el hilo principal entre en suspensión indefinidamente, en lugar de esperar la entrada. Tenemos un gancho de apagado que manejará las SIGTERM/SIGINTseñales adecuadamente:

        if (args.length >= 0 && StringUtils.equals(args[0], "daemon")) {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

información relacionada