Ausführen von Programmen im Hintergrund vom Terminal aus


136

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.                                                                        


7
nohup 'command' & Das scheint zu funktionieren. Probleme damit?
Oberton

Antworten:


173

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:

setsid gnome-calculator

Ich bin auch ziemlich angetan von dem, disownwas verwendet werden kann, um einen Prozess vom aktuellen Baum zu trennen. Sie verwenden es in Verbindung mit dem kaufmännischen Und:

gnome-calculator & disown

Ich habe auch gerade gelernt, wie man Subshells mit Klammern erzeugt. Diese einfache Methode funktioniert:

(gnome-calculator &)

Und natürlich gibt es das, nohupwie du erwähnt hast. Ich bin nicht verrückt danach, nohupweil es die Tendenz hat, zu schreiben, ~/nohup.outohne dass ich es verlange. Wenn Sie sich darauf verlassen, könnte es für Sie sein.

nohup gnome-calculator

Und für die längerfristigen Prozesse gibt es Dinge wie screenund 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 screenTutorials, aber hier ist ein einfacher Einstieg:


Oli, im Falle von DISPLAY =: 0 unity - ersetze welche der oben genannten Optionen und warum?
verrückt nach natty

4
@nuttyaboutnatty die gesamte Partie in seiner eigenen Shell - Sitzung wickeln: 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.
Oli

1
@nuttyaboutnatty Das ist es, was ich meine, aber am Ende würden Sie nicht zwei Instanzen ausführen, weil --replacedies 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.
Oli

1
Perfekt, das, was für mich funktioniert hat, war die Subshell '(Gnom-Rechner &)'. Ich verwende es, um eine Monokonsolen-App im Hintergrund zu starten. Bei den anderen Techniken würde die Mono-App sofort abstürzen.
Nikolaos Georgiou

2
Hinweis für zukünftige Benutzer : Die Erstellung von nohup.outkann unterdrückt werden, indem sowohl stdout als auch sterr nach Belieben umgeleitet /dev/nullwerden:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy

55

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

nm-applet &

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 exitoder 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.CtrlD

Alles auf einmal machen:

nm-applet & exit

Das ist erstaunlich! Ich habe das nie gewusst und du scheinst die einzige Person zu sein, die das erwähnt. Das ist definitiv mein Lieblingsansatz in einer Desktop-Umgebung. Schade, ich kann nicht mehr stimmen; p
7hi4g0

Ich habe dies mit einer anderen Anwendung versucht und es ist fehlgeschlagen: matlab & exitDie matlab & exit
Ausführung

Ich wunderte mich, warum OP sagte, dass das Schließen des Terminals seine Hintergrundprogramme zum Absturz brachte. Ich habe noch nie versucht, ein Terminal über die Schaltfläche "x" im Fenster zu schließen.
user1717828

Die Taste x ist töten, es wird nicht sauber beendet, der Befehl exit tut dies. Sie könnten die x-Taste stattdessen einem Exit-Befehl zuordnen ...
Tim Baker

14

Wie Sie betonten, können Sie rennen

nohup nm-applet &  

um das Endsignal beim Schließen des Terminals zu ignorieren. Kein Problem damit.


Irgendwelche anderen Alternativen? Nur um des Wissens willen, nicht für irgendetwas anderes
OVERTONE

Bei Wikipedia ( en.wikipedia.org/wiki/Nohup ) gibt es einen Vorschlag, echo command | at nowden ich nicht zum Laufen bringen konnte.
Desgua

2
Ich frage mich, wie es auf der Benutzeroberfläche funktioniert, wenn Sie auf ein Symbol oder Programm doppelklicken.
Oberton

execBietet eine Alternative zum nohup <command> &Ausführen eines Prozesses im Hintergrund und zum Zurückgeben der aktuellen Shell-Eingabeaufforderung.
JSStuball

12

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

bg

um den laufenden Prozess in den Hintergrund zu stellen. Problem

fg

stattdessen, um den laufenden Prozess wieder in den Vordergrund zu stellen.

EDIT : Weitere Details in dieser Antwort habe ich später entdeckt.


7

Verwenden Sie (exec PROGRAM &> /dev/null & )PID der Subshell zu ermöglichen , indem übernommen werden PROGRAM. Ich habe diesen Ansatz mehrfach mit verschiedenen Programmen getestet. Das Schließen des ursprünglichen Terminals hat keine Auswirkungen auf das neu erstellte Programm

Kleine Demo:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working

Hmmm (exec firefox)hängt das Terminal, bis ich Firefox beende ... und das Terminal schließe SIGHUPs die Shell und die Subshell
kos

Ich habe meine Antwort bearbeitet. Getestet es mit mehreren anderen Programmen. Ich habe in dieser Version keinen Firefox oder ein anderes Programm beobachtet, das das steuernde Terminal
aufhängt

funktioniert gut für mich
Zanna

Ich glaube nicht, dass die Verwendung von bashs exec notwendig ist, es könnte sein, dass Sie die PID aus irgendeinem Grund benötigen.
Marinara

2

Ich kann das byobu terminal weiterempfehlen. Sie können Ihren Prozess einfach trennen, indem Sie die Taste F6 drücken.


1

Obwohl es oben gute Antworten gibt, möchte ich meine 2 Cent darauf geben, wie ich MATLAB im Hintergrund verwende.

sudo -b matlab

Das -bsudo-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


0

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.


2
Willkommen bei Ask Ubuntu! Ich empfehle , diese Antwort zu bearbeiten , um sie mit spezifischen Details zu erweitern. (Siehe auch Wie schreibe ich eine gute Antwort ?, um allgemeine Ratschläge zu erhalten, welche Arten von Antworten auf Ask Ubuntu als am wertvollsten erachtet werden.)
David Foerster

0

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. (Siehe kstart.cppQuellcode als Referenz . Wie Sie dort sehen, verwendet KProcess::startDetachedund KProcessleitet er einen neuen Prozess ab QProcess, startDetachedstartet ihn und trennt sich von ihm.)

Ähnlich ist auch kde-openoder xdg-openoder gnome-open.


So wie es aussieht, handelt es sich eher um einen Kommentar als um eine Antwort. Zum Vergrößern bitte bearbeiten . Geben Sie nicht nur einen Einzeiler; erkläre, warum du recht hast, idealerweise mit Zitaten. Antworten ohne Begründung können entfernt werden.
anonymous2
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.