Asynchrone Shell-Befehle

100

Ich versuche, ein Shell-Skript zu verwenden, um einen Befehl zu starten. Es ist mir egal, ob / wann / wie / warum es endet. Ich möchte, dass der Prozess gestartet und ausgeführt wird, aber ich möchte sofort zu meiner Shell zurückkehren können ...

LorenVS
quelle
2
Siehe auch Unterschied zwischen nohup, disown und & unter Unix und Linux Stack Exchange.
JWW
1
Für die Suche nach einer tiefer gehende Antwort , dass die Gespräche über die Unterschiede zwischen nohup, &unddisown , klicken Sie hier , um die Rolle zu der vierten Antwort .
noɥʇʎԀʎzɐɹƆ

Antworten:

116

Sie können das Skript einfach im Hintergrund ausführen:

$ myscript &

Beachten Sie, dass dies anders ist als das Einfügen &in Ihr Skript, das wahrscheinlich nicht das tut, was Sie wollen.

Carl Norum
quelle
1
Ich wusste, dass es etwas Einfaches werden würde, vielen Dank ... Linux ist einfach nicht mein Ding, aber ich versuche, mich auf den neuesten Stand zu bringen ... Übrigens, wird das funktionieren, wenn es mit nohup kombiniert wird?
LorenVS
2
Was ist der Unterschied zwischen dem Einfügen des & in die Befehlszeile und dem Einfügen in das Skript? Mir war nicht bewusst, dass sie unterschiedlich waren.
Jacob Sharf
8
@JacobSharf, probieren Sie es aus und Sie werden sehen. Wenn sich das &im Skript befindet und Sie kein haben wait, wird der Hintergrundbefehl beim Beenden des Skripts beendet.
Carl Norum
Oh. Das erklärt einiges. Ich habe kürzlich einen Effekt bemerkt, der dadurch verursacht werden würde. Googeln führte mich tatsächlich zu dieser Seite. Vielen Dank
Jacob Sharf
Wenn myscriptdie Terminalumgebung geändert wird, z. Es handelt sich um einen Terminalinitialisierungsbefehl, der nicht sofort benötigt wird und verzögert werden kann. Wird die Terminalumgebung trotzdem geändert?
noɥʇʎԀʎzɐɹƆ
58

Jeder hat es einfach vergessen disown. Also hier ist eine Zusammenfassung:

  • & stellt den Job in den Hintergrund.

    • Blockiert den Versuch, Eingaben zu lesen, und
    • Lässt die Shell nicht auf ihre Fertigstellung warten.
  • disown Entfernt den Prozess aus der Jobsteuerung der Shell, lässt ihn jedoch weiterhin mit dem Terminal verbunden.

    • Eines der Ergebnisse ist, dass die Shell kein a sendet SIGHUP(Wenn die Shell ein empfängt SIGHUP, sendet sie auch ein SIGHUPan den Prozess, wodurch der Prozess normalerweise beendet wird).
    • Und natürlich kann es nur auf Hintergrundjobs angewendet werden (da Sie es nicht eingeben können, wenn ein Vordergrundjob ausgeführt wird).
  • nohupTrennt den Prozess vom Terminal, leitet seinen Ausgang an das Terminal um nohup.outund schirmt ihn ab SIGHUP.

    • Der Prozess wird nicht gesendet SIGHUP.
    • Es ist völlig unabhängig von der Jobsteuerung und kann im Prinzip auch für Vordergrundjobs verwendet werden (obwohl das nicht sehr nützlich ist).
    • Wird normalerweise mit &(als Hintergrundjob) verwendet.
Ani Menon
quelle
Ich kann es disownunter Debian oder OS X nicht finden. Ich dachte, es wäre ein Programm, aber ich scheine mich zu irren. Was ist es?
JWW
Befehl ablehnen und unter OSX
Ani Menon
6
Dies ist die beste Antwort. Am umfassendsten.
noɥʇʎԀʎzɐɹƆ
3
Auf jeden Fall die beste Antwort, weiß nicht warum so kleine Ups
HeberLZ
1
@VladGanshin Nr.
Ani Menon
39
nohup cmd

legt nicht auf, wenn Sie das Terminal schließen. Die Ausgabe erfolgt standardmäßig an nohup.out

Sie können dies mit Hintergrund kombinieren,

nohup cmd &

und die Ausgabe loswerden,

nohup cmd > /dev/null 2>&1 &

Sie können auch disowneinen Befehl. Typ cmd, Ctrl-Z, bg,disown

Steve B.
quelle
2
Cool, verrückt, wie sich alles verbindet, ich denke, die Bestellung würde mich zuerst erreichen, aber ich nehme an, Sie könnten es sich einfach merken (was Sie geschrieben haben oder "nohup cmd &> / dev / null 2> & 1" :))
LorenVS
Ich bin heute Abend darauf gestoßen. Ich habe 2 Tage lang mit einem Shell-Skript gekämpft und dieser Vorschlag hat die Dinge zum Laufen gebracht. Vielen Dank!
JD Long
Genial, das ist sehr nützlich. Wenn Sie im Hintergrundmodus ausgeführt werden, können Sie die Ausgabe des Befehls von Zeit zu Zeit überprüfen. tail nohup.outDadurch werden die letzten 10 Zeilen der Befehlsausgabe angezeigt. Ich verwende dies für Rsync-Sicherungsjobs, um zu sehen, in welcher Datei es sich gerade befindet.
Martin Hansen
Was ist, wenn ich dies tue, aber den Hintergrundprozess stoppen möchte?
Stephan Bijzitter
Die Shell druckt eine Job-ID, wenn Sie einen Job genau zu diesem Zweck starten. Sie können Ihre laufenden Jobs jederzeit mit sehen jobs.
Tripleee
26

Alternativ können Sie nach dem Ausführen des Programms Strg-Z drücken, um das Programm zu stoppen, und dann eingeben

bg

Dadurch wird Ihr zuletzt gestopptes Programm in den Hintergrund gestellt. (Nützlich, wenn Sie etwas ohne '&' gestartet haben und es dennoch im Hintergrund haben möchten, ohne es neu zu starten.)

pajton
quelle
2
Danke, das ist ein cooler kleiner Trick ... Ich fange an, etwas von der Muschelgüte wirklich zu schätzen ...
LorenVS
3

screen -m -d $command$Startet den Befehl in einer getrennten Sitzung. Sie können eine Verbindung screen -rzur gestarteten Sitzung herstellen. Es ist ein wunderbares Tool, das auch für Remote-Sitzungen äußerst nützlich ist. Lesen Sie mehr unter man screen.

mluthra
quelle
@LadenkovVladislav Ich bin zu 95% sicher, dass Sie den Bildschirm auf RedHat installieren können. Ich habe auf CentOS.
BuvinJ
Unter Ubuntu wollte ich den Windows / Batch-Befehl "start" emulieren. Das heißt, Sie starten asynchron ein Vordergrundprogramm (GUI) und fahren mit einem Shell-Skript fort. Das macht genau das.
BuvinJ