Unix/Java-Prozess wird angehalten, wenn er in den Hintergrund verschoben wird

Unix/Java-Prozess wird angehalten, wenn er in den Hintergrund verschoben wird

Wir haben einen Java-Prozess, der mit Appassembler erstellt wurde. Er läuft einwandfrei, solange er gestartet und im Vordergrund ausgeführt wird:

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

Wir können dann erfolgreich auf die Anwendung zugreifen und sie testen. Wenn wir sie jedoch im Hintergrund starten, wird sie nicht nur nicht mehr ausgeführt, sondern wir können sie auch nicht wiederbeleben, ohnein den Vordergrund rücken:

[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.

Starte ich es falsch? Gibt es eine Möglichkeit, den Job weiterlaufen zu lassen, obwohl er im Hintergrund läuft? Ich muss ihn als Daemon-Prozess starten nohupund mich dann abmelden, aber ich kann ihn scheinbar nicht erfolgreich weiterlaufen lassen, wenn er nicht der Vordergrundprozess bleibt, was nicht machbar ist.

Antwort1

Es scheint, dass Hintergrundjobs auf Eingaben wartenwerden gestopptin den meisten Umgebungen.

Von demWikipedia-Seite zu Unix Job Control:

Ein Hintergrundprozess, der versucht, von seinem Steuerterminal zu lesen oder darauf zu schreiben, erhält ein SIGTTIN-Signal (für Eingabe) oder SIGTTOU-Signal (für Ausgabe). Diese Signale stoppen den Prozess standardmäßig, können aber auch auf andere Weise verarbeitet werden.

Und von einemRutgers-Seite zur fortgeschrittenen Verwendung von Unix:

Ein im Hintergrund ausgeführter Job wird angehalten, wenn er Eingaben benötigt. Einem Hintergrundjob können keine Eingaben übermittelt werden. Stellen Sie daher sicher, dass alle erforderlichen Eingaben verfügbar sind.

Als LösungWir haben unseren Java-Prozess einfach so aktualisiert, dass er ein optionales Argument akzeptiert, das den Hauptthread auf unbestimmte Zeit in den Ruhezustand versetzt, anstatt auf eine Eingabe zu warten. Wir haben einen Shutdown-Hook, der die SIGTERM/SIGINTSignale entsprechend verarbeitet:

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

verwandte Informationen