Hier ist die Funktionalität, nach der ich suche (und noch nicht ganz gefunden habe):
Ich habe x Prozesse, die ich nacheinander ausführen möchte. Einige von ihnen könnten ziemlich zeitaufwendig sein.
Ich möchte, dass diese Prozesse im Hintergrund meiner Shell ausgeführt werden.
Ich weiß von Nohup, aber es scheint nicht perfekt zu funktionieren ... angenommen Job1 ist ein zeitaufwendiger Job, wenn ich + c aus der Leerzeile drehe, die ich bekomme, nachdem ich nohup job1 & amp; & amp; job2 & amp; & amp; job3 & amp ;, dann werden job2 und job3 nicht ausgeführt, und job1 läuft möglicherweise nicht oder läuft nicht, je nachdem wie lange ich nohup laufen lasse.
Gibt es eine Möglichkeit, die gewünschte Funktionalität zu erhalten? Ich bin ssh'ed in einen Linux-Server. Für Bonuspunkte würde ich es lieben, wenn die Jobs, die ich in die Warteschlange stellte, auch dann weiterlaufen würden, wenn ich meine Verbindung schloss.
Danke für Ihre Hilfe.
EDIT: Ein kleines Addendum zur Frage: Wenn ich ein Shell-Skript mit drei Exec-Anweisungen habe
Exec grandios Exec smallthing exec smallthing
Wird es definitiv sequentiell sein? Und gibt es eine Möglichkeit, diese alle in eine Exec-Zeile einzubinden, um die entsprechende Funktionalität zu erhalten?
dh exec BIGTHING & amp; smallthing & amp; smallthing oder & amp; & amp; oder soetwas
Verwenden Sie screen
.
screen
job1;job2;job3
- getrennt durch Semikolon, sie werden nacheinander ausgeführt CTRL-A
, D
(später)
screen -r
Alternativ, wenn Sie ein bisschen mehr Kontrolle über Ihre Warteschlange haben möchten, z. Die Möglichkeit, Einträge aufzulisten und zu ändern, finden Sie Task Spooler
. Es ist in den Ubuntu 12.10 Universe-Repositories als Paket task-spooler
verfügbar.
Ich stimme zu, dass screen
ein sehr praktisches Werkzeug ist. Es gibt ein zusätzliches Befehlszeilen-Tool enqueue
- mit dem zusätzliche Jobs nach Bedarf in die Warteschlange eingereiht werden können, auch wenn Sie bereits eine gestartet haben der Jobs können Sie ein weiteres hinzufügen, wenn das erste bereits ausgeführt wird.
Hier ist ein Beispiel aus enqueue
README:
ein wenig mehr Informationen:
Wenn Sie Ihre Jobs mit & amp; & amp; es ist äquivalent zu dem & amp; & amp; und -Operator in einer Programmiersprache, wie etwa in einer if-Anweisung. Wenn Job 1 mit einem Fehler zurückkehrt, wird Job 2 nicht ausgeführt usw. Dies wird "Kurzschließen" genannt. Wenn Sie die Jobs mit trennen; Stattdessen werden sie alle unabhängig vom Rückgabecode ausgeführt.
Wenn Sie die Zeile mit & amp; Es wird Hintergrund die ganze Sache. Wenn Sie dies vergessen, können Sie Strg + Z drücken, um den Befehl anzuhalten und Ihnen eine Eingabeaufforderung zu geben. Dann wird der Befehl "bg" als Hintergrund verwendet.
Wenn Sie Ihre ssh-Sitzung schließen, beendet sie wahrscheinlich die Befehle, weil sie an Ihre Shell angehängt sind (zumindest in den meisten Bash-Implementierungen). Wenn Sie möchten, dass es nach dem Abmelden fortgesetzt wird, verwenden Sie den Befehl "disown".
Der grundlegende Mechanismus für den Hintergrund eines Jobs von der Shell ist
%Vor%Sie könnten also ein einfaches Shell-Skript erstellen, das es sequentiell für mehrere von ihnen ausführt, obwohl ich zu diesem Zeitpunkt erwägen würde, in eine Skriptsprache wie Perl oder Python einzutauchen und ein einfaches Skript zu schreiben, um diese Prozesse zu verzweigen. Wenn sich Ihr Skript selbst als erster Schritt ausgibt und alle seine Aufgaben in der fork ausführt, gibt es sofort die Kontrolle an die Shell zurück und läuft weiter, selbst wenn Sie sich ausloggen.
Um es im Hintergrund von der Shell zu lösen (Aufgaben, die nur mit &
im Hintergrund stehen, unterliegen Shell-Spielen), benutze
Seidid foo