Sollte ich auf dem Desktop mit Bash ' & ' verwenden, nohup, disown, oder eine Kombination der drei, um einen Prozess zu starten und ihn vollständig alleine laufen zu lassen?

Wenn ich diese vier Befehle unter Xubuntu 16.04 entweder lokal oder über ssh ausführe, scheinen sie alle genau dasselbe zu tun:

export DISPLAY=:0.0 #not necessary unless you have logged in over ssh instead of starting a terminal locally 
  1. gedit & 
  2. gedit & disown 
  3. nohup gedit 
  4. nohup gedit & disown 

Ich weiß nicht Ermitteln Sie den Unterschied zwischen gedit & und gedit & disown, denn wenn ich das übergeordnete Terminal töte oder mich von einer SSH-Sitzung abmelde, scheint dies der Fall zu sein gedit wird in beiden Szenarien „abgelehnt“.

Bei zwei und drei besteht der einzige Unterschied darin, dass die Befehlsausgabe in einer separaten Datei protokolliert wird und auch dann in diesem separaten Protokoll protokolliert wird, wenn Die ursprüngliche Shell-Sitzung, die den bg-Prozess ausgelöst hat, wird beendet.

Bei drei und vier lese ich immer wieder, dass es einen technischen Unterschied gibt, kann aber überhaupt nicht verstehen, warum Sie einen dem anderen vorziehen würden.

Welches soll ich verwenden? Ich habe alle vier in Tutorials verwendeten Befehle gesehen und Q & As, und trotz einiger wirklich guter Antworten, die die technischen Unterschiede zwischen nohup und disown beschreiben, kann ich anscheinend keine klare Empfehlung erhalten (außer vielleicht zu Protokollierungszwecken oder zur Shell-Kompatibilität), für die ich eine verwenden sollte.

Kommentare

  • Sie benötigen & in allen Fällen, in denen Sie in der Shell fortfahren möchten (und das Programm teilt sich nicht selbst). Möglicherweise benötigen Sie nohup nicht für Programme, die die Dateideskriptoren schließen und sich selbst trennen (das. Gibt für die meisten GUI-Anwendungen wahr). Sie können disown nachträglich verwenden (wenn Sie nohup vergessen haben) und wie zuvor beschrieben, benötigen GUI-Apps es nicht.

Antwort

Wenn ich ein Skript ausführen muss, das für eine lange Zeit ausgeführt wird, und ich bin eingeschaltet Bei einer ssh -Sitzung möchte ich entweder:

  1. Die Aufgabe sollte fortgesetzt werden, auch wenn das Netzwerk unterbrochen wird oder wenn ich meinen Laptop packe und weggehe

    a. Die Aufgabe kann ohne interaktive Eingabe von mir beendet werden.

     nohup do_my_stuff & 

    b. Die Aufgabe benötigt möglicherweise etwas von mir auf stdin .

     man tmux history -w tmux do_my_stuff 
  2. Der Hintergrundprozess verbessert irgendwie meine aktuelle Sitzung und sollte zusammen mit der Sitzung sterben. Eine Seltenheit.

     enhance_my_session >>/tmp/enhance.$$.log 2>&1 & 
  3. Ich möchte, dass das Ding bei meiner SSH-Sitzung zufällig einige Protokolle ausspuckt. Warten Sie, was? Nein, das würde ich nie wollen. Danke Sie disown.

  4. Eine andere Sache, die ich nie will: konvertieren den Prozess zu einem vollständig getrennten Daemon, aber vermeiden Sie es, ihn beim nächsten Start automatisch zu starten. Ich würde das niemals wollen, da ich nicht vorhersagen kann, wann das System neu gestartet wird und wer es neu starten wird.

Antwort

Normalerweise mache ich nur Folgendes:

  1. myprog &, wenn ich nur etwas im Hintergrund ausführen möchte meine aktuelle Login-Shell. Dies ist für mich in 99% der Fälle ausreichend …

  2. nohup myprog > /my/path/output.txt &, wenn ich etwas von der Shell aus starte, dies aber möchte Melden Sie sich anschließend ab (möglicherweise während die Hintergrundaufgabe noch ausgeführt wird).

Antwort

Sie Das Ausscheiden aus der Shell vom Abbruch des Terminals muss unterschieden werden.

  1. Die Shell beendet alle bekannten Jobs (aber nicht ihre untergeordneten), wenn ein Abbruchsignal empfangen wird.
  2. Das Terminal wird beendet Alles, wofür es das steuernde Terminal war.

Im Allgemeinen ist die beste Lösung (auf Benutzerebene) IMHO screen.

Wenn Ihre Aufgabe eher systembezogen als benutzerbezogen ist, können Sie sie stattdessen zu einem systemd-Dienst machen, den Sie manuell starten.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.