Manchmal möchte ich einen Prozess starten und ihn vergessen. Wenn ich es von der Kommandozeile aus starte, so:
redshift
Ich kann das Terminal nicht schließen, sonst wird der Vorgang abgebrochen. Kann ich einen Befehl so ausführen, dass ich das Terminal schließen kann, ohne den Prozess zu beenden?
yourExecutable &
auf dem Bildschirm angezeigt wird, auch wenn Sie weiterhin tippen und die Ausgaben auf dem Bildschirm angezeigt werden Sie tippen. Der Prozess wird abgelehnt und Sie können das Terminal schließen, ohne dass der Prozess zum Erliegen kommt.Ctrl+C
disown;
Enter
Antworten:
Eine der folgenden 2 sollte funktionieren:
oder
Weitere Informationen zur Funktionsweise finden Sie im Folgenden:
man nohup
help disown
Unterschied zwischen nohup, disown und & (lesen Sie auch die Kommentare)
quelle
redshift & disown
) funktionierte für mich unter Ubuntu 10.10. Es scheint gut zu funktionieren, wenn man alles auf eine Linie bringt. Gibt es einen Grund, warum ich das nicht tun sollte?nohup redshift &
es auch Hintergrund ist). Und die zweite Zeile in eine Zeile zu setzen ist in Ordnung, obwohl Sie normalerweise mit;
(redshift &; disown
) trennen;
und&
sind Befehlstrennzeichen und haben die gleiche Priorität. Der einzige Unterschied besteht in der synchronen bzw. asynchronen Ausführung. Es ist nicht erforderlich,&;
nur zu verwenden&
(es funktioniert, aber es ist ein bisschen redundant).redshift &!
wird die Rotverschiebung sofort ausgeblendet.Wenn Ihr Programm bereits läuft , können Sie es mit pausieren
Ctrl-Z
, in den Hintergrund ziehenbg
und dann mitdisown
, wie folgt :quelle
disown
trennt weder stdout noch stderr. Diesnohup
gilt jedoch ebenso wie für>/dev/null
(Standardausgang trennen)2>/dev/null
(Standardfehler trennen). Es (disown
) trennt die Jobsteuerung.Eine gute Antwort wurde bereits von @StevenD gepostet, aber ich denke, das könnte es ein bisschen klarer machen.
Der Grund dafür, dass der Prozess beim Beenden des Terminals abgebrochen wird, ist, dass der Prozess, den Sie starten, ein untergeordneter Prozess des Terminals ist. Sobald Sie das Terminal schließen, werden auch diese untergeordneten Prozesse beendet. Sie können den Prozessbaum mit sehen
pstree
, zum Beispiel wenn Siekate &
in Konsole laufen:Verwenden Sie mit dem Befehl Folgendes , um den
kate
Prozess von der Verbindung zu trennen,konsole
wenn Sie ihn beenden :konsole
nohup
Nach dem Schließen
konsole
,pstree
wird wie folgt aussehen:und
kate
wird überleben. :)Eine Alternative ist die Verwendung von
screen
/tmux
/byobu
, die die Schale am Laufen halten wird, unabhängig von dem Terminal.quelle
Sie können den Vorgang wie folgt im Terminal ausführen
setsid process
Dadurch wird das Programm in einer neuen Sitzung ausgeführt. Wie erklärt http://hanoo.org/index.php?article=run-program-in-new-session-linux
quelle
nohup.out
. 2) Sie verbleibt nicht in der Jobliste Ihrer Shell, sodass die Ausgabe von nicht überladen wirdjobs
.Obwohl alle Vorschläge gut funktionieren, habe ich festgestellt, dass es meine Alternative ist
screen
, ein Programm zu verwenden , das ein virtuelles Terminal auf Ihrem Bildschirm einrichtet.Sie könnten darüber nachdenken, es mit zu beginnen . Screen kann auf nahezu allen Linux- und Unix-Derivaten installiert werden. Wenn Sie + und (in Kleinbuchstaben) drücken, wird eine zweite Sitzung gestartet. Auf diese Weise können Sie zwischen der ersten Sitzung durch Drücken von + und oder der neueren Sitzung durch Drücken von + und hin- und herschalten . Sie können bis zu zehn Sitzungen in einem Terminal durchführen. Früher habe ich eine Sitzung bei der Arbeit begonnen, bin nach Hause gegangen, habe mich in meine Arbeitsmaschine eingemischt und habe dann aufgerufen . Dadurch werden Sie wieder mit dieser Remote-Sitzung verbunden.
screen -S session_name
CtrlACCtrlA0CtrlA1screen -d -R session_name
quelle
screen -d -m command
Ich starte es in einem bereits abgetrennten Bildschirm:~# screen -d -m top ~# screen -ls There is a screen on: 10803..Server-station (Detached) 1 Socket in /root/.screen. ~# screen -x
.... und du bist dabei.Die einzige Möglichkeit, dies alles in der Shell zu tun, besteht darin, stdin zu schließen und den Befehl im Hintergrund auszuführen:
Dann wird es nicht beendet, wenn Sie die Shell beenden. Das Umleiten von stdout ist eine nette optionale Sache.
Nachteil ist, dass Sie dies nicht nachträglich tun können.
quelle
Ich habe ein Skript für:
Führen Sie im Hintergrund beliebige Befehle aus
Verhindern Sie, dass sie mit dem Terminalfenster getötet werden
Unterdrücke ihre Ausgabe
Behandelt den Beendigungsstatus
Ich benutze es vor allem für die
gedit
,evince
,inkscape
etc , die alle viel lästige Terminal Ausgang. Wenn der BefehlTIMEOUT
vorzeitig beendet wird , wird der Beendigungsstatus von nohup anstelle von Null zurückgegeben.Beispiele ...
quelle
Ich bevorzuge:
(Anwendungsname &)
zum Beispiel:
linux@linux-desktop:~$ (chromium-browser &)
Achten Sie darauf, Klammern zu verwenden, wenn Sie den Befehl eingeben!
quelle
nohup
verhindert jede tty-Ausgabe und ich wollte eigentlich nur die Ausgabe in eine Datei umleiten und es hat verhindert, dass dies für mich die bessere Lösung ist.Sie können einen Prozess (PID) so einstellen, dass beim Abmelden und Schließen der Terminalsitzung kein HUP-Signal empfangen wird. Verwenden Sie den folgenden Befehl:
quelle
Wohl ähnlich der Antwort von apolinsky verwende ich eine Variante von
screen
. Der Vanille-Befehl ist wie folgtDie Sitzung kann mit getrennt Ctrl ACtrl Dund im einfachen Fall mit wieder verbunden werden
screen -r
. Ich habe dies in ein Skript mit dem Namen eingewickeltsession
, das in meinemPATH
für den bequemen Zugriff bereitsteht:Dies funktioniert nur, wenn Sie vorher wissen, dass Sie ein Programm trennen möchten. Es ist nicht vorgesehen, dass ein bereits ausgeführtes Programm getrennt wird.
quelle
Ähnlich wie bei anderen Antworten, die zuvor gepostet wurden, kann man dank reptyr einen laufenden Prozess übertragen, um "screen" nachträglich zu verwenden, und dann das Terminal schließen. Die Schritte werden in diesem Beitrag beschrieben . Die zu treffenden Schritte sind:
quelle