Ich fange ein INT-Signal in Java mit dem folgenden Code:
%Vor% Wenn ich java -jar file.jar
verwende, um meine Anwendung zu starten, kann ich das mit kill -INT PID
gesendete Signal abfangen.
Wenn ich java -jar file.jar &
aufruft (jvm läuft im Hintergrund), kann ich das mit kill -INT
gesendete Signal nicht abfangen.
Irgendwelche Ideen?
Danke.
Funktioniert für mich. Sind Sie sicher, dass Sie das richtige Pid töten? Unter Unix können Sie $!
verwenden, um die PID des zuletzt gestarteten Prozesses zu erhalten.
Aktualisierung:
Wenn Sie dies im Hintergrund über ein Shell-Skript starten, erstellt das Betriebssystem eine neue Prozessgruppe, die immun gegen Tastatur-generierte Signale wie SIGINT ist. Nur Prozesse, deren Prozessgruppen-ID mit der Prozessgruppen-ID des aktuellen Terminals übereinstimmt, können diese Signale empfangen.
Versuchen Sie also, es in der Prozessgruppe des aktuellen Terminals wie folgt auszuführen:
%Vor%Sie können dann SIGINT senden.
Weitere Informationen zur Jobkontrolle hier .
Ich gehe davon aus, dass das Bash-Skript SIGINT ignoriert und das Kind die Signalmaske erbt.
Schau im Bash-Skript nach so etwas. (Es kann mehr Zahlen als nur 2 geben.)
%Vor%Die leere Zeichenfolge bewirkt, dass die Shell SIG_IGN setzt. Wenn Sie stattdessen verwenden:
%Vor%Das registriert einen Handler, der nichts tut. Wenn ein untergeordneter Prozess gestartet wird, wird jedes Signal mit einem installierten Handler auf SIG_DFL zurückgesetzt.