Frage Programme im Hintergrund vom Terminal aus ausführen


Wie führe ich ein Programm im Hintergrund einer Shell aus, mit der Möglichkeit, die Shell zu schließen, während das Programm läuft? Nehmen wir an, meine Benutzeroberfläche hat Probleme oder aus irgendeinem Grund muss ich ein Programm aus dem Terminalfenster starten. nm-applet:

nm-applet

Wenn es gestartet wird, belegt es den Vordergrund des Terminalfensters.

Gibt es eine einfache Möglichkeit, das Programm im Hintergrund auszuführen, ohne das Terminal offen zu lassen oder das gesamte Terminal zu belegen?

In diesem Sinne habe ich einen Weg gefunden, Programme vom Terminal aus zu starten und andere Eingaben zuzulassen, indem ich ein kaufmännisches Und-Zeichen angehängt habe (&) zu dem Befehl als solcher:

nm-applet &

Dies ist jedoch wenig sinnvoll, da alle im Terminal gestarteten Prozesse beendet werden, sobald das Terminal geschlossen ist.


121
2018-02-22 00:07


Ursprung


nohup 'command' & Das scheint zu funktionieren. Irgendwelche Probleme damit? - OVERTONE


Antworten:


Ich bin kürzlich gekommen, um zu mögen setsid. Es sieht so aus, als ob Sie nur etwas vom Terminal laufen lassen, aber Sie können die Verbindung trennen (schließen Sie das Terminal) und es geht einfach weiter.

Dies liegt daran, dass der Befehl tatsächlich ausgibt und während die Eingabe an das aktuelle Terminal weitergeleitet wird, gehört sie einem komplett anderen Elternteil (das bleibt am Leben, nachdem Sie das Terminal geschlossen haben).

Ein Beispiel:

setsid gnome-calculator

Ich bin auch ziemlich voreingenommen disown mit dem ein Prozess vom aktuellen Baum getrennt werden kann. Sie verwenden es in Verbindung mit dem Hintergrund-Et-Zeichen:

gnome-calculator & disown

Ich habe auch gerade etwas über das Hervorbringen von Unterschalen mit Klammern gelernt. Diese einfache Methode funktioniert:

(gnome-calculator &)

Und natürlich ist da nohup wie du erwähnt hast. Ich bin nicht wild nohup weil es dazu neigt, zu schreiben ~/nohup.out ohne dass ich darum gebeten habe. 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 screen und andere virtuelle Terminal-Muxer, die Sitzungen zwischen Verbindungen am Leben erhalten. Diese gelten wahrscheinlich nicht wirklich für Sie, weil Sie nur temporären Zugriff auf die Terminalausgabe wünschen, aber wenn Sie möchten geh zurück einige Zeit später und sehen Sie die neuesten Terminal-Aktivität, Bildschirm wäre wahrscheinlich Ihre beste Wahl.

Das Internet ist voll von screen Tutorials, aber hier ist ein einfacher Schnellstart:


156
2018-02-22 00:41



Oli, im Falle von DISPLAY =: 0 Einheit - ersetzen Welches der obigen würden Sie verwenden und warum? - nutty about natty
@nuttyoutaboutnatty wickeln die ganze Menge in einer eigenen Shell-Sitzung: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Das ist so ziemlich meine Lösung für alles, um sicherzustellen, dass es richtig ausgeht. - Oli♦
@nuttyaboutnatty Das ist, was ich meine, aber Sie würden nicht mit zwei Instanzen enden, weil --replace tut, wie es sich anhört und beendet tatsächlich die alte Instanz. Wenn Sie es zum zweiten Mal innerhalb der xsession ausführen, wird die an TTYn gebundene Kopie beendet und Sie können diese in Zukunft verwenden, wenn Sie sie benötigen. Es gibt wahrscheinlich einen besseren Weg, es zu tun, aber genau das, was mir jedes Mal in den Sinn kommt, wenn ich es brauche. - Oli♦
Perfekt, die eine, die für mich funktionierte, war die Unterschale "(Gnomenrechner &)". Ich benutze es, um eine Mono-Konsolen-App im Hintergrund zu starten. Mit den anderen Techniken würde die Mono-App sofort abstürzen. - Nikolaos Georgiou
Hinweis für zukünftige Benutzer: Erstellung von nohup.out kann unterdrückt werden, indem sowohl stdout als auch sterr umgeleitet werden /dev/null so: nohup firefox &> /dev/null & - Sergiy Kolodyazhnyy


Hier sind die zwei Möglichkeiten, mit denen ich gehen würde. Erstens, nicht von einem Terminal aus; schlagen Alt+F2 Öffnen Sie den Laufdialog und führen Sie ihn von dort aus (ohne &).

Von einem Terminal aus ausführen

nm-applet &

Schließen Sie das Terminal NICHT selbst. Das heißt, drücken Sie nicht die X-Taste zum Schließen, und verwenden Sie nicht Datei -> Beenden aus seiner Menüleiste. Wenn Sie das Terminal auf diese Weise schließen, sendet es ein HUP (Hang Up) -Signal an die Bash, die in diesem Fall läuft, was wiederum das HUP-Signal an alle seine Kinder sendet (weshalb nohup in diesem Fall funktioniert).

Verlassen Sie stattdessen die Shell, indem Sie ausführen exit oder schlagen Strg+D. Bash wird dann seine Kinder verleugnen, dann beenden und die Hintergrundprozesse noch laufen lassen. Und wenn bash beendet wird, hat das Terminal seinen untergeordneten Prozess verloren, also wird es auch geschlossen.

Alles gleichzeitig machen:

nm-applet & exit

46
2018-02-23 11:45



Das ist erstaunlich! Ich wusste das nie und du scheinst die einzige Person zu sein, die das erwähnt. Definitiv das ist mein Lieblingsansatz in einer Desktop-Umgebung. Schade, ich kann nicht mehr preisen; - 7hi4g0
Ich habe das mit einer anderen Anwendung versucht und es ist fehlgeschlagen: matlab & exit Das Ausführen von zwei separaten Befehlen funktionierte gut: matlab &  exit - MattKelly
Ich habe mich gefragt, warum OP sagte, das Schließen des Terminals habe seine Hintergrundprogramme zum Absturz gebracht. Ich habe noch nie versucht, ein Terminal mit der "x" -Taste am Fenster zu schließen. - user1717828
Der x-Button ist kill, es wird nicht sauber beendet, der Befehl exit tut dies. Sie könnten die X-Taste stattdessen einem Exit-Befehl zuordnen ... - Tim Baker


Wie Sie gesagt haben, können Sie rennen

nohup nm-applet &  

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


13
2018-02-22 00:17



Irgendwelche anderen Alternativen? Nur um der Erkenntnis willen, nicht um etwas anderes - OVERTONE
Bei Wikipedia ( en.wikipedia.org/wiki/Nohup ) Es gibt einen Vorschlag zu verwenden echo command | at now womit ich es nicht zur Arbeit bringen konnte. - desgua
Ich frage mich, wie es von der Benutzeroberfläche funktioniert, wenn Sie auf ein Symbol oder ein Programm doppelklicken. - OVERTONE


Eine Sache, die viele andere Antworten fehlen, ist, wie man einen laufenden Prozess löst, der die Shell derzeit blockiert. In den meisten Terminals und Shells, Strg+Z stoppt den laufenden Prozess und bringt Sie zurück zu einer Eingabeaufforderung. Dann können Sie ausgeben

bg

um den laufenden Prozess in den Hintergrund zu schicken. Problem

fg

stattdessen den laufenden Prozess wieder in den Vordergrund zu rücken.

BEARBEITEN: Mehr Details in diese Antwort Ich habe es später entdeckt.


10
2018-03-31 14:37





Benutzen (exec PROGRAM &> /dev/null & ) um zu ermöglichen, dass die PID der Subshell übernommen wird 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

7
2017-11-30 11:35



Hmmm (exec firefox) Hängt das Terminal, bis ich Firefox verlasse ... und schließe das Terminal SIGHUPs die Shell und die Subshell - kos
Ich habe meine Antwort bearbeitet. Getestet mit mehreren anderen Programmen. Ich habe nicht beobachtet, dass Firefox oder andere Programme das steuernde Terminal in dieser Version hängen - Sergiy Kolodyazhnyy
funktioniert gut für mich - Zanna


Ich kann das Byobu-Terminal empfehlen. Sie können Ihren Prozess leicht trennen, indem Sie die Taste F6 drücken.


2
2018-03-05 00:07





Obwohl es oben gute Antworten gibt, möchte ich meine 2 Cent darüber geben, wie ich MATLAB im Hintergrund benutze.

sudo -b matlab

Das -b Das Tag von sudo 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, die Sie verwenden können, um Shell-Befehle zu erklären. http://explainshell.com/explain/8/sudo


1
2018-06-28 14:39





Ich weiß nicht, es ist der richtige Weg, aber ich beginne nur eine andere Sitzung, während die vorherige Allone verlassen. Zum Beispiel habe ich einen einfachen Webserver auf meiner Himbeere laufen lassen. das web.py eins. Dann starte ich eine neue Sitzung und lasse sie in Ruhe. das ist es. Es ist auch sehr nützlich, da Sie immer noch aktualisiert werden, obwohl Sie an der anderen Sitzung arbeiten.


0
2017-07-05 22:15



Willkommen bei Ask Ubuntu! ich empfehle bearbeitenDiese Antwort wird um spezifische Details erweitert. (Siehe auch Wie schreibe ich eine gute Antwort? für allgemeine Ratschläge, welche Art von Antworten auf Ask Ubuntu am wertvollsten sind.) - David Foerster