Unterprozesse von Bash/Gnome-Terminal werden nicht beendet (CentOS/RHEL)

Unterprozesse von Bash/Gnome-Terminal werden nicht beendet (CentOS/RHEL)

heute habe ich etwas beobachtet, das wahrscheinlich eine einfache Erklärung hat, aber von meiner Seite aus ziemlich unerwartet war: Ich verwende CentOS (und RHEL, das sich genauso verhält). Ich öffne eine Bash in einem Terminal und starte einen beliebigen Unterprozess wie gedit. Das Fenster öffnet sich, einwandfrei. Wenn ich ein „ps“ mache, kann ich sehen, dass gedit die Bash als übergeordneten Prozess hat, der selbst das Gnome-Terminal als übergeordneten Prozess hat. Wenn ich dann die Bash stoppe, würde ich erwarten, dass auch alle untergeordneten Prozesse gestoppt werden. Aber gedit läuft weiter und der übergeordnete Prozess hat sich auf 1 (init) geändert!

Ich habe versucht, die Shell nicht einfach zu stoppen, sondern sie hart zu beenden, gleiches Ergebnis. Es wurde versucht, das Terminal statt der Shell zu beenden, immer noch dasselbe Ergebnis. Erst wenn ich das Terminal durch Klicken auf die X-Schaltfläche schließe, wird auch gedit geschlossen.

Dieses Verhalten habe ich nicht erwartet. Wenn ich gedit mit nohup starten würde, wäre ich nicht überrascht, aber selbst ohne nohup ... warum bleibt es aktiv?

Vielleicht kann jemand Licht ins Dunkel bringen und weiß, was da los ist. Vielen Dank im Voraus!

Antwort1

Programme wie gedit, gvim, google-chrome und viele andere verzweigen sich automatisch in den Hintergrund. So können Sie

gedit /home/msw/ul-answer

ordnen Sie das neue Fenster zu und erhalten Sie Ihre Shell-Eingabeaufforderung zurück. Das ist keine schlechte Designentscheidung und es gibt normalerweise eine Option, sie zu überschreiben. Die Befehle gedit -wund gvim --noforkwerden nicht vom steuernden Terminal getrennt und geben Ihnen nicht Ihre Shell-Eingabeaufforderung zurück.

Damit ein Programm in den Hintergrund tritt, wird es aufgespalten und dann das übergeordnete Programm beendet. Dadurch wird Ihre normale Instanz von gedit fast unmittelbar nach der Eingabe zu einem untergeordneten Programm von init (PPID == 1).

Andere Programme wie Mplayer oder Calibre werden nicht automatisch in den Hintergrund gestellt, entweder weil sie nicht häufig aufgerufen werden oder weil sie gerne Debug-Informationen an ihr Steuerterminal weitergeben.

hinzugefügte Kuriosität:

Nachdem ich ein wenig Zeit damit verbracht habe, dies zu testen und mir die Strace-Ausgabe und dergleichen anzusehen, scheint sich gedit nicht automatisch in den Hintergrund zu versetzen. Was ich über gvim gesagt habe, gilt immer noch und es ist längst Zeit für den Ruhezustand, also lasse ich das vorerst so stehen.

Antwort2

Wenn Sie das Terminalfenster schließen, sendet der Kernel eineSEUFZENDSignal an Bash. Bash sendet dann ein SIGHUP an jeden Job, sodass es gedit mit einem SIGHUP beendet.

Wenn Sie Bash durch Eingeben exitvon oder Ctrl+ Doder durch Beenden mit SIGKILL beenden, erkennt der Terminalemulator, dass sein untergeordneter Prozess beendet wurde, und schließt das Fenster. Gedit ist davon nicht betroffen.

verwandte Informationen