Ist es notwendig, einen Prozess abzulehnen, damit er nach der Trennung weiter ausgeführt wird?

Ist es notwendig, einen Prozess abzulehnen, damit er nach der Trennung weiter ausgeführt wird?

Kann mir jemand erklären, ob und warum das disownnotwendig ist, wenn Sie einen Job auch nach der Trennung weiterlaufen lassen möchten?

Ich frage, weil auf allen von mir besuchten Sites empfohlen wird, disownund zu verwenden, bgaber bges allein funktioniert bei mir, und ich bin nicht sicher, warum.

Liegt es daran, dass ich nicht ganz verstanden habe, wozu disownes dient, oder gibt es irgendwo Einstellungen, die das Standardverhalten des bgBefehls beeinflussen?

Folgendes habe ich getan:

  • Über SSH mit meiner CentOS 6-Box verbunden
  • Es wurde ein einfacher Prozess erstellt:

    tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
    
  • Den Job ausgesetzt

  • Habe es im Hintergrund fortgesetzt überbg 1
  • Verbindung zum SSH-Server getrennt

Anschließend habe ich per FTP geprüft, ob die .tar.gzDatei immer noch größer wurde, und das war der Fall.

Antwort1

Prozesse, die über bgoder in den Hintergrund gedrängt werden &, werden typischerweise in zwei Szenarien beendet:

  1. Die Shell empfängt ein SIGHUP
  2. Sie versuchen, auf ein Terminal zu schreiben, das nicht mehr existiert.

Punkt 1 ist der Hauptschuldige beim Schließen Ihres Terminals. Ob dies jedoch geschieht oder nicht, hängt davon ab,WieSie schließen Ihr Terminal. Sie können es folgendermaßen schließen:

  1. So etwas wie das Klicken auf das "X" in Ihrem Fenstermanager
  2. Sie können exit, logout, oder CTRL+ eingeben D.

Bei Punkt 1 wird ein SIGHUP gesendet, bei Punkt 2 nicht.

Kurz gesagt: Wenn Sie einen Prozess mit in den Hintergrund stellen und sich dann mit , , oder + bgabmelden , wird der Prozess nicht beendet.exitlogoutCTRLD

Antwort2

Wenn Sie ein Terminal schließen, erhalten alle Prozesse, die dieses Terminal verwenden (siehe TTYSpalte in der Ausgabe), ein . Es liegt am Prozess, was er damit macht . In klassischen Unix-Systemen (AIX, Solaris) werden Prozesse mit diesem Signal geschlossen. Deshalb müssen Sie verwenden . Von :ps -elfSIGHUPSIGHUPdisownman bash

Die Shell wird standardmäßig beendet, wenn ein SIGHUP empfangen wird. Vor dem Beenden sendet eine interaktive Shell das SIGHUP erneut an alle laufenden oder gestoppten Jobs. An gestoppte Jobs wird SIGCONT gesendet, um sicherzustellen, dass sie das SIGHUP empfangen. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte dieser mit dem integrierten Befehl disown (siehe unten „SHELL BUILTIN COMMANDS“) aus der Jobtabelle entfernt oder mit disown -h so markiert werden, dass er kein SIGHUP empfängt.

verwandte Informationen