Wie führe ich ein Programm im Hintergrund einer Shell aus, wobei die Shell geschlossen werden kann, während das Programm ausgeführt wird? Können sagen , meine UI Probleme oder aus irgendeinem Grund haben, ich brauche ein Programm aus dem Terminal - Fenster zu booten, sagen nm-applet
:
nm-applet
Wenn es gestartet wird, nimmt es den Vordergrund des Terminalfensters ein.
Gibt es eine einfache Möglichkeit, das Programm im Hintergrund auszuführen, ohne das Terminal geöffnet zu lassen oder das gesamte Terminal zu belegen?
In diesem Sinne habe ich eine Möglichkeit gefunden, Programme vom Terminal aus auszuführen und andere Eingaben zuzulassen, indem ich ein kaufmännisches Und ( &
) an den Befehl als solchen anhängte :
nm-applet &
Dies ist jedoch wenig sinnvoll, da alle im Terminal gestarteten Prozesse abgebrochen werden, sobald das Terminal geschlossen wird.
quelle
Antworten:
Ich bin vor kurzem gekommen, um zu mögen
setsid
. Es sieht zunächst so aus, als würden Sie nur etwas vom Terminal ausführen, aber Sie können die Verbindung trennen (das Terminal schließen) und es geht einfach weiter.Dies liegt daran, dass der Befehl tatsächlich abgebrochen wird und sich, während die Eingabe am aktuellen Terminal eingeht, im Besitz eines völlig anderen übergeordneten Elements befindet (das nach dem Schließen des Terminals noch aktiv ist).
Ein Beispiel:
Ich bin auch ziemlich angetan von dem,
disown
was verwendet werden kann, um einen Prozess vom aktuellen Baum zu trennen. Sie verwenden es in Verbindung mit dem kaufmännischen Und:Ich habe auch gerade gelernt, wie man Subshells mit Klammern erzeugt. Diese einfache Methode funktioniert:
Und natürlich gibt es das,
nohup
wie du erwähnt hast. Ich bin nicht verrückt danach,nohup
weil es die Tendenz hat, zu schreiben,~/nohup.out
ohne dass ich es verlange. Wenn Sie sich darauf verlassen, könnte es für Sie sein.Und für die längerfristigen Prozesse gibt es Dinge wie
screen
und andere virtuelle Terminal-Muxer, die Sitzungen zwischen Verbindungen am Leben erhalten. Diese wahrscheinlich nicht wirklich auf Sie zutreffen , weil Sie nur temporären Zugriff auf das Terminal ausgegeben werden sollen, aber wenn man will zurückgeht einige Zeit später und die aktuelle Terminal - Aktivität sehen, Bildschirm würde wahrscheinlich die beste Wahl sein.Das Internet ist voll von
screen
Tutorials, aber hier ist ein einfacher Einstieg:quelle
sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown
. Das ist so ziemlich meine Lösung für alles, um sicherzugehen, dass es richtig herausspringt.--replace
dies das tut, wonach es sich anhört, und die alte Instanz tatsächlich beendet. Wenn Sie es das zweite Mal in der xsession ausführen, wird die an TTYn gebundene Kopie beendet, und Sie können sie in Zukunft verwenden, wenn Sie sie benötigen. Es gibt wahrscheinlich einen besseren Weg, es zu tun, aber genau das, was mir jedes Mal einfällt, wenn ich es brauche.nohup.out
kann unterdrückt werden, indem sowohl stdout als auch sterr nach Belieben umgeleitet/dev/null
werden:nohup firefox &> /dev/null &
Hier sind die beiden Wege, die ich gehen würde. Erstens, nicht von einem Terminal aus ausführen; Drücken Sie Alt+ F2, um den Ausführungsdialog zu öffnen, und führen Sie ihn von dort aus (ohne &).
Führen Sie von einem Terminal aus
Schließen Sie das Terminal jedoch NICHT selbst. Drücken Sie also nicht die X-Taste, um das Fenster zu schließen, und verwenden Sie nicht die Menüleiste Datei -> Beenden. Wenn Sie das Terminal auf diese Weise schließen, sendet es ein HUP-Signal (Hang UP) an die Bash, die im Terminal ausgeführt wird. Dadurch wird das HUP-Signal an alle untergeordneten Geräte gesendet (weshalb nohup in diesem Fall funktioniert).
Verlassen Sie stattdessen die Shell, indem Sie + ausführen
exit
oder drücken . Bash wird dann seine Kinder nicht mehr sehen, dann beenden und die Hintergrundprozesse laufen weiter. Und wenn bash beendet wird, hat das Terminal seinen untergeordneten Prozess verloren, sodass es auch geschlossen wird.CtrlDAlles auf einmal machen:
quelle
matlab & exit
Diematlab &
exit
Wie Sie betonten, können Sie rennen
um das Endsignal beim Schließen des Terminals zu ignorieren. Kein Problem damit.
quelle
echo command | at now
den ich nicht zum Laufen bringen konnte.exec
Bietet eine Alternative zumnohup <command> &
Ausführen eines Prozesses im Hintergrund und zum Zurückgeben der aktuellen Shell-Eingabeaufforderung.Eine Sache, auf die viele andere Antworten fehlen, ist das Trennen eines laufenden Prozesses, der derzeit die Shell blockiert. In den meisten Terminals und Shells stoppt Ctrl+ Zden laufenden Prozess und bringt Sie zu einer Eingabeaufforderung zurück. Dann können Sie ausstellen
um den laufenden Prozess in den Hintergrund zu stellen. Problem
stattdessen, um den laufenden Prozess wieder in den Vordergrund zu stellen.
EDIT : Weitere Details in dieser Antwort habe ich später entdeckt.
quelle
Verwenden Sie
(exec PROGRAM &> /dev/null & )
PID der Subshell zu ermöglichen , indem übernommen werdenPROGRAM
. Ich habe diesen Ansatz mehrfach mit verschiedenen Programmen getestet. Das Schließen des ursprünglichen Terminals hat keine Auswirkungen auf das neu erstellte ProgrammKleine Demo:
quelle
(exec firefox)
hängt das Terminal, bis ich Firefox beende ... und das Terminal schließe SIGHUPs die Shell und die SubshellIch kann das byobu terminal weiterempfehlen. Sie können Ihren Prozess einfach trennen, indem Sie die Taste F6 drücken.
quelle
Obwohl es oben gute Antworten gibt, möchte ich meine 2 Cent darauf geben, wie ich MATLAB im Hintergrund verwende.
Das
-b
sudo-Tag kann Anwendungen im Hintergrund ausführen. Sie können das Terminal auch schließen, nachdem Sie diesen Befehl ausgeführt haben.Wahrscheinlich ohne Bezug, aber es gibt eine wunderbare Website, auf der Sie Shell-Befehle erklären können. http://explainshell.com/explain/8/sudo
quelle
Ich weiß nicht, wie es richtig ist, aber ich beginne einfach eine neue Sitzung, während ich die vorherige allein lasse. Zum Beispiel habe ich einen einfachen Webserver auf meiner Himbeere ausgeführt. die web.py ein. Dann starte ich eine neue Sitzung, während ich sie in Ruhe lasse. das ist es. Es ist auch sehr nützlich, da Sie immer noch auf dem neuesten Stand sind, obwohl Sie gerade an der anderen Sitzung arbeiten.
quelle
Falls KDE verwendet wird, können Sie auch verwenden
kstart
, wodurch Ihr Programm losgelöst vom Terminal gestartet wird. Außerdem wird sichergestellt, dass die KDE-Umgebung für den Befehl korrekt eingerichtet ist. (Siehekstart.cpp
Quellcode als Referenz . Wie Sie dort sehen, verwendetKProcess::startDetached
undKProcess
leitet er einen neuen Prozess abQProcess
,startDetached
startet ihn und trennt sich von ihm.)Ähnlich ist auch
kde-open
oderxdg-open
odergnome-open
.quelle