Binden Sie das Leben eines Prozesses an die Shell, die es gestartet hat

8

Auf UNIX-y-Weise versuche ich, einen Prozess zu starten, Hintergrundinformationen zu erstellen und die Lebensdauer dieses Prozesses an meine Shell anzubinden.

Worüber ich spreche, ist nicht einfach der Hintergrundprozess, ich möchte, dass der Prozess SIGTERM gesendet wird, oder dass er einen offenen Dateideskriptor hat, der geschlossen ist, oder etwas , wenn der Shell-Exits, sodass der Benutzer der Shell den Prozess nicht explizit beenden muss oder eine Warnung "Sie haben laufende Jobs" erhalten.

Letztendlich möchte ich ein Programm, das für jeden Shell- und Carry-Status zusammen mit dieser Shell einzeln ausgeführt werden kann und schließt, wenn die Shell geschlossen wird.

Die IBM DB2-Konsolenbefehle funktionieren auf diese Weise. Wenn Sie eine Verbindung zur Datenbank herstellen, wird ein "db2bp" -Prozess generiert, der den Datenbankstatus und die Verbindung mit Ihrer Shell verbindet. Sie können eine Verbindung in mehreren verschiedenen Terminals oder SSH-Verbindungen herstellen, jede mit ihrem eigenen db2bp-Prozess. Wenn diese geschlossen sind, stirbt der entsprechende db2bp-Prozess und diese Verbindung wird geschlossen.

DB2-Abfragen werden dann mit dem Befehl db2 gestartet, der sie einfach an den entsprechenden db2bp-Prozess übergibt. Ich weiß nicht, wie es mit dem korrekten db2bp-Prozess kommuniziert, aber vielleicht verwendet es das tty-Gerät, das mit stdin als eindeutiger Schlüssel verbunden ist? Ich denke, ich muss das auch herausfinden.

Ich habe noch nie etwas geschrieben, was Manipulation tut, also habe ich keine Ahnung, wo ich anfangen soll. Ich denke, ich kann den Rest herausfinden, wenn ich nur einen Prozess spawnen kann, der beim Shell-Exit automatisch beendet wird. Wer weiß, wie DB2 es macht?

    
Kyren 04.12.2009, 18:27
quelle

4 Antworten

2

Wenn Ihre Shell keine Subshell ist, können Sie Folgendes tun: Schreiben Sie folgendes in ein Skript namens "ttywatch":

%Vor%

Dann führe dein Programm wie folgt aus:

%Vor%

Durch das Aufheben des Prozesses wird verhindert, dass sich die Shell darüber beschwert, dass laufende Prozesse ausgeführt werden. Wenn das Terminal geschlossen wird, wird SIGTERM ( 15 ) innerhalb von 5 Sekunden an den Subprozess (Ihre App) übermittelt.

Wenn die Shell keine Subshell ist, können Sie mindestens ein Programm wie ttywrap verwenden geben Sie ihr ein eigenes tty, und dann funktioniert der obige Trick.

    
geocar 04.12.2009, 20:37
quelle
2

Okay, ich denke, ich habe es herausgefunden. Ich habe es zu kompliziert gemacht:)

Ich denke, alle db2 ist dämonizing-db2bp, dann ruft db2bp waitpid auf der übergeordneten PID (der PID der Shell) auf und beendet sich, nachdem waitpid zurückkehrt.

Die Kommunikation zwischen dem Befehl db2 und db2bp scheint über Fifo mit einem Dateinamen zu erfolgen, der auf der PID der übergeordneten Shell basiert.

Waaaay einfacher als ich dachte:)

Für alle, die neugierig sind, bestand das ganze Bestreben darin, eine interaktive Python- oder Groovy-Sitzung mit einer Shell zu verknüpfen, sodass ich Code testen konnte, während ich einfach in eine Sitzung hinein und wieder ausstieg, die Datenbankverbindungen und temporäre Klassen behielt / Variablen.

Vielen Dank für Ihre Hilfe!

    
Kyren 04.12.2009 20:27
quelle
0

Ihre Shell sollte ein SIGHUP-Signal an alle laufenden untergeordneten Prozesse senden, wenn sie heruntergefahren wird. Haben Sie versucht, Ihrer Anwendung einen SIGHUP-Handler hinzuzufügen, um ihn sauber herunterzufahren? wenn die Schale austritt?

    
Jim Lewis 04.12.2009 18:47
quelle
0

Ist es möglich, dass Ihr wirkliches Problem hier die Shell ist und nicht Ihr Prozess? Mein Verständnis stimmt mit Jim Lewis überein, dass wenn die Schale stirbt, ihre Kinder SIGHUP bekommen sollten. Aber worüber du dich beschwerst, ist die Shell (oder vielleicht das Terminal), die versucht, dich daran zu hindern, eine laufende Shell mit aktiven Kindern versehentlich zu töten.

Lesen Sie das Handbuch für die Shell oder das Terminal, um zu sehen, ob dieses Verhalten konfigurierbar ist.

Aus dem Bash-Handbuch auf meinem MacBook:

  

Die Shell wird standardmäßig bei Empfang eines SIGHUP beendet. Vor dem Beenden sendet eine interaktive Shell das SIGHUP erneut   zu allen Jobs, laufend oder gestoppt. Gestoppte Jobs werden an SIGCONT gesendet, um sicherzustellen, dass sie die SIGHUP erhalten. Zu   verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte sie mit der Job-Tabelle entfernt werden   die Enteignung eingebaut (siehe SHELL BUILTIN BEFEHLE unten) oder markiert, um SIGHUP nicht zu erhalten, indem du -h enternt.

     

Wenn die Option huponexit shell mit shopt festgelegt wurde, sendet bash bei interaktiven Interaktionen ein SIGHUP an alle Jobs   Login Shell beendet.

was Sie in die richtige Richtung weisen könnte.

    
dmckee 04.12.2009 19:08
quelle

Tags und Links