11 Stimmen

Linux: Wie kann man einige Aufträge im Hintergrund in eine Warteschlange stellen?

Hier ist die Funktionalität, die ich suche (und noch nicht ganz gefunden habe):

Ich habe x Prozesse, die ich sequentiell ausführen möchte. Einige von ihnen könnten recht zeitaufwendig sein.

Ich möchte, dass diese Prozesse im Hintergrund meiner Shell laufen.

Ich kenne nohup, aber es scheint nicht perfekt zu funktionieren...angenommen, Job1 ist ein zeitaufwändiger Job, wenn ich ctrl+c aus der leeren Zeile, die ich nach nohup job1 && job2 && job3 & erhalte, dann werden Job2 und Job3 nicht ausgeführt, und Job1 könnte oder könnte nicht ausgeführt werden, je nachdem, wie lange ich nohup laufen lasse.

Gibt es eine Möglichkeit, die von mir gewünschte Funktionalität zu erhalten? Ich bin mit einem Linux-Server per SSH verbunden. Als Bonus würde ich es begrüßen, wenn die Aufträge in der Warteschlange auch dann weiterlaufen würden, wenn ich die Verbindung beende.

Vielen Dank für Ihre Hilfe.

EDIT: Ein kleiner Nachtrag zur Frage: Wenn ich ein Shell-Skript mit drei exec-Anweisungen habe

AUSFÜHRUNG BIGTHING exec smallthing Ausführung smallthing

Wird es auf jeden Fall fortlaufend sein? Und gibt es eine Möglichkeit, diese alle in eine exec-Zeile zu verpacken, um die gleiche Funktionalität zu erhalten?

d.h. Ausführung BIGTHING & smallthing & smallthing oder && oder ähnliches

15voto

eumiro Punkte 193562

使用方法 screen .

  1. ssh zum Server
  2. laufen. screen
  3. starten Sie Ihre Programme: job1;job2;job3 - durch Semikolon getrennt, werden sie nacheinander ausgeführt
  4. Lösen Sie sich vom Bildschirm: CTRL-A , D
  5. sich vom Server abmelden

(später)

  1. ssh zum Server
  2. laufen. screen -r
  3. und Sie befinden sich in Ihrer Shell, während Ihre Auftragswarteschlange läuft...

8voto

tachylatus Punkte 93

Wenn Sie etwas mehr Kontrolle über Ihre Warteschlange haben möchten, z. B. die Möglichkeit, Einträge aufzulisten und zu ändern, sollten Sie sich Task Spooler . Es ist in den Repositories von Ubuntu 12.10 Universe als Paket verfügbar task-spooler .

3voto

myroslav Punkte 3613

Ich stimme zu, dass screen ist ein sehr praktisches Werkzeug. Es gibt ein zusätzliches Kommandozeilenwerkzeug enqueue - die es ermöglicht, bei Bedarf weitere Aufträge in die Warteschlange zu stellen, d. h. selbst wenn Sie bereits einen Auftrag gestartet haben, können Sie einen weiteren hinzufügen, wenn der erste bereits läuft.

Hier ein Beispiel aus enqueue README:

$ enqueue add mv /disk1/file1 /disk2/file1
$ enqueue add mv /disk1/file2 /disk2/file2
$ enqueue add beep
$ enqueue list

1voto

rbrc Punkte 864

Ein paar weitere Informationen:

Wenn Sie Ihre Aufträge mit && trennen, entspricht dies dem Operator &&/und in einer Programmiersprache, z. B. in einer if-Anweisung. Wenn Auftrag 1 mit einem Fehler zurückkommt, wird Auftrag 2 nicht ausgeführt usw. Dies wird als "Kurzschluss" bezeichnet. Wenn Sie die Aufträge stattdessen mit ; trennen, werden sie alle unabhängig vom Rückgabewert ausgeführt.

Wenn Sie die Zeile mit & abschließen, wird der gesamte Text im Hintergrund angezeigt. Wenn Sie es vergessen, können Sie Strg+z drücken, um den Befehl anzuhalten und eine Eingabeaufforderung zu erhalten, dann wird der Befehl "bg" sie in den Hintergrund stellen.

Wenn Sie Ihre ssh-Sitzung schließen, werden die Befehle wahrscheinlich beendet, da sie an Ihre Shell angehängt sind (zumindest in den meisten Implementierungen von bash). Wenn Sie wollen, dass es nach dem Abmelden weitergeht, verwenden Sie den Befehl "disown".

0voto

Arne Claassen Punkte 13640

Der grundlegende Mechanismus für die Hintergrundsteuerung eines Auftrags von der Shell aus ist

job1 &

Du könntest also ein einfaches Shell-Skript schreiben, das dies nacheinander für mehrere von ihnen erledigt, obwohl ich an diesem Punkt in Betracht ziehen würde, in eine Skriptsprache wie Perl oder Python einzutauchen und ein einfaches Skript zu schreiben, um diese Prozesse zu forken. Wenn Ihr Skript sich selbst als ersten Schritt aufspaltet und seine gesamte Arbeit in der Aufspaltung erledigt, gibt es die Kontrolle sofort an Sie auf der Shell zurück und läuft weiter, auch wenn Sie sich abmelden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X