GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verzweige ich einen Prozess, der nicht stirbt, wenn die Shell beendet wird?

Die zuverlässigste Methode scheint zu sein:

(setsid emacs &)

Dies verwendet ( &) in den Hintergrund verzweigen und setsid vom steuernden tty trennen.

Sie können dies in eine Shell-Funktion einfügen:

fork() { (setsid "[email protected]" &); }

fork emacs

Die Möglichkeiten sind:

  • Die disown eingebauter Befehl:

    emacs &
    disown $!
    

    & fungiert als Befehlstrenner und disown verwendet standardmäßig den neuesten Job, daher kann dies verkürzt werden zu:

    emacs & disown
    
  • Double-fork() :

    (emacs &)
    

    Befehle in Klammern ( ) werden in einem separaten Shell-Prozess ausgeführt.

  • setsid , wie von Rich vorgeschlagen, könnte die beste Wahl sein, da es das steuernde TTY des Prozesses durch Erstellen einer neuen Sitzung deaktiviert:

    setsid emacs
    

    Allerdings ist es auch etwas unvorhersehbar - es wird nur fork() in den Hintergrund, wenn er der Anführer einer Prozessgruppe ist (was nicht passiert, wenn setsid wird in einem sh verwendet Skript zum Beispiel; in solchen Fällen wird es lediglich resistent gegen Strg-C.)


Sie erwähnen nicht, ob dies als X-App oder als Konsolen-App ausgeführt wird.

Wenn es sich um eine Konsolen-App handelt, muss sie natürlich geschlossen werden. Sie haben die Ein- / Ausgabe entfernt, genauer gesagt das (Pseudo-) tty, auf dem es sich befand. Es ist sehr unwahrscheinlich, dass Sie das gemeint haben, also nehmen wir an, Sie sprechen von einer X-App.

nohup sollte funktionieren, keine Ahnung warum nicht. Wenn die Shell schließt, sendet sie SIGHUP auf alle Prozesse in seiner Prozessgruppe. nohup weist den Befehl an, SIGHUP zu ignorieren.

Sie können auch setsid ausprobieren, das den Prozess von der Prozessgruppe trennt

alias emacs='setsid emacs'

Oder fügen Sie disown hinzu nach &


Überprüfen Sie Ihre Shell-Einstellungen. Sie können es auch mit screen statt nohup versuchen .


Linux
  1. [Linux] :So schließen Sie das Verzeichnis aus, wenn Sie den Shell-Befehl „tar“ verwenden

  2. Wie starte ich alle Shell-Sitzungen in einem anderen Verzeichnis als $home?

  3. Wann ist setsid() nützlich oder warum müssen wir Prozesse in Linux gruppieren?

  4. Wie erhalte ich den Exit-Code des erzeugten Prozesses im erwarteten Shell-Skript?

  5. Gibt es eine Linux-Distribution oder einen Kernel-Patch, der einen Prozessspeicherplatz löscht, nachdem der Prozess beendet wurde?

Wie kann ich ein Semaphor wiederherstellen, wenn der Prozess, der es auf Null dekrementiert hat, abstürzt?

Wie führe ich ein Shell-Skript aus, wenn sich eine Datei oder ein Verzeichnis ändert?

Wie kann man Node.js als Hintergrundprozess ausführen und nie sterben?

So erhalten Sie die PID von einem gegabelten untergeordneten Prozess im Shell-Skript

Bleibt eine Prozess-PID garantiert gleich, solange der Prozess nicht stirbt?

Wie starte ich im Einzelbenutzermodus eine zweite Shell?