Wie setze ich den Befehl im Hintergrund, schließe das Terminal und bringe es zurück zu fg?

10

Ich versuche herauszufinden, wie ein Befehl im Hintergrund ausgeführt und später in den Vordergrund gestellt wird. Ich habe genug von Tutorials und Antworten, in denen Leute sagen, dass es einfach ist. Fügen Sie einfach &das Ende des Befehls hinzu, damit er im Hintergrund ausgeführt wird. Es funktioniert nur innerhalb eines einzelnen Terminalfensters. Ich möchte den Befehl in einem Terminal in den Hintergrund stellen und ihn nach dem erneuten Öffnen des Terminals wieder in den Vordergrund stellen

Beispiel:

$ grunt &
$ jobs
$ [1]+  Running  grunt &

Natürlich wird nach dem Schließen des Terminals kein Job gefunden.

Nächstes Beispiel:

$ grunt & disown #the same behavior has: $ setsid grunt &
$ jobs
$ [nothing] #but ps shows that grunt is working

after close terminal, grunt doesn't work

Was habe ich falsch gemacht? Könnte mir jemand erklären, wie man den Befehl im Hintergrund ausführt und wieder in den Vordergrund rückt.

Timur Fayzrakhmanov
quelle

Antworten:

11

Es ist unmöglich, wie Sie wollen.

Lassen Sie uns einige grundlegende Konzepte überprüfen:

  • Eine Prozessgruppe ist eine Sammlung verwandter Prozesse, die alle gleichzeitig signalisiert werden können.
  • Eine Sitzung ist eine Sammlung von Prozessgruppen, die entweder an ein einzelnes Endgerät (das als steuernde Terminal bezeichnet werden) oder an kein Terminal angeschlossen sind.

Wenn Sie das Terminal geschlossen haben, sind alle Prozesse in der Sitzung tot, mit Ausnahme derjenigen (Dämonen), die für den Init-Prozess repariert wurden. Und es gibt keine Möglichkeit, ihnen wieder ein Kontrollterminal zu geben.

Kurz gesagt, die Prozessreparatur ist in POSIX-Systemen stark eingeschränkt (Daemonisierung ist eine Ausnahme) und Ihre Anforderungen können nicht erfüllt werden.

sgx1
quelle
6
Technisch gesehen ist dies die richtige Antwort, aber ich glaube, dass Besucher, die dieses Problem haben, "ihre Lösung" in den anderen Antworten finden, in denen screen / byobu / tmux erwähnt wird.
Programster
Sie haben Recht ..., aber aus meiner Sicht sind die Grundkonzepte wichtiger, um zu verstehen, wie das System besser funktioniert und was Sie wollen und was Sie falsch machen. Danke euch beiden!
Timur Fayzrakhmanov
16
  1. Installieren screen:

    sudo apt-get install screen
  2. Start screen:

    screen -S session_name
  3. Führen Sie Ihre Befehle aus, was Sie brauchen.

  4. Trennen Sie sich screenvom Terminal (Ihre Befehle werden weiterhin ausgeführt):

    Drücken Sie CTRL+ a+d

  5. Schließen Sie das Terminal

  6. Öffnen Sie ein anderes Terminal und schließen Sie die letzte screenSitzung erneut an:

    screen -r

Weitere Informationen und zusätzliche Optionen zum screenNachschauen man screen.

Falkner
quelle
2
Bildschirm oder Byobu (insbesondere wenn Sie Ubuntu ausführen). Byobu basiert auf dem Bildschirm, wenn ich richtig bin, aber ich finde, dass es zusätzliche Funktionen hat, die ich nützlich und einfacher zu verwenden finde, aber das ist Ansichtssache.
Programster
Vielen Dank für einen guten Vorschlag! Vielleicht wird es in der Funktion benötigt!) Aus Russland mit Liebe <3
Timur Fayzrakhmanov
@Programster, ja, Byobu ist Ex. Bildschirm. Es hat sowohl byobu-screen als auch byobu-tmux.
user.dz
1
Ich empfehle tmuxals Alternative zu screen.
Gerrit
5

Haben Sie versucht: byobuoder tmuxwelche Terminal-Multiplexer sind. Nicht genau das, wonach Sie suchen, aber es hat ein ähnliches Verhalten.

byobu-screen

Führen Sie dann Ihren Befehl aus, um Folgendes zu trennen:

byobu-screen -d

Wieder aufzunehmen:

byobu-screen -r

Siehe https://help.ubuntu.com/community/Screen

user.dz
quelle
Diese auch +1.
Falkner