Einfaches Warteschlangensystem?

10

Bei einem Standard-PC möchten wir damit rund um die Uhr einige Aufgaben im Hintergrund ausführen.

Grundsätzlich möchten wir Befehle wie:

add-task *insert command here*
list-tasks
remove-task(s)

Die hinzugefügten Aufgaben sollten einfach in eine Warteschlange gestellt und nacheinander im Hintergrund ausgeführt werden (nach dem Abmelden der Shell weiter ausgeführt).

Gibt es ein einfaches Skript / Programm, das dies tut?

dagnelies
quelle

Antworten:

7

Es gibt einen Standardbefehl batch, der mehr oder weniger das tut, wonach Sie suchen. Genauer gesagt, batchführt die Jobs einzeln aus, wenn die Systemlast nicht zu hoch ist (sodass keine Parallelisierung durchgeführt wird). Der batchBefehl ist Teil des atPakets.

echo 'command1 --foo=bar' | batch      
echo 'command2 "$(wibble)"' | batch
at -q b -l              # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234         # Unschedule a pending task (atq gives the task ID)
Gilles 'SO - hör auf böse zu sein'
quelle
Es ist falsch zu sagen, dass der batchBefehl "keine Parallelisierung durchführt". Normalerweise gibt es eine Standardverzögerung von 60 Sekunden zwischen dem Starten eines Jobs und dem Starten des nächsten. Es gibt jedoch nichts, was den nächsten Job warten lässt, bis der erste abgeschlossen ist. atdSobald der durch die -bOption festgelegte Wert abgelaufen ist, werden Jobs aus der Stapelwarteschlange gestartet (siehe atdManpage).
rsaw
Batch serialisiert die Aufgaben nicht streng. Wenn Sie also eine einzige gemeinsam genutzte Ressource haben, sollte die Antwort von @sitaram (Task-Spooler) besser funktionieren.
Ergosys
5

Eine andere Lösung besteht darin lpd, einen benutzerdefinierten "Druckertreiber" zu verwenden und zu erstellen, mit dem Ihre Jobs ausgeführt werden. Ein Freund half mir dabei, das herauszufinden, als ich eine ähnliche Anfrage hatte. Erstellen Sie ein Skript wie dieses und fügen Sie es ein /tmp/batch.sh:

#!/bin/bash

TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE

Dann renne:

lpadmin -p batch1 -E -P /tmp/batch.sh

Dadurch wird eine Warteschlange gestartet, und Sie können mehr erstellen, indem Sie andere Namen anstelle von batch1 verwenden. Fügen Sie einen Job hinzu mit:

lp -d batch1 /path/to/jobscript

Verwalten der Aufträge mit lpq, lprmund lpstat. Wenn Sie mehr Flexibilität bei der Übergabe von Argumenten an Ihre Jobs wünschen, können Sie das Skript batch.sh schicker machen.

(Ich habe es versucht, batchbevor ich diesen Weg eingeschlagen habe, aber entweder funktioniert es unter OSX nicht als Warteschlange, oder ich habe es falsch verwendet.)

Joe Fusion
quelle
Mir ist klar, dass @arnaud "Commodity PC" angegeben hat, was bedeutet, dass es wahrscheinlich nicht OSX ist, wo ich diese Lösung getestet habe. Dies sollte jedoch portabel sein und ist viel flexibler als batch.
Joe Fusion
1
Dies ist möglicherweise einer der echtesten Hacks, die ich je gesehen habe.
Thiago Macedo
Leider scheint dies nicht mehr zu funktionieren. github.com/apple/cups/commit/…
wdkrnls
4

Es gibt viele Warteschlangensysteme, die jedoch häufig sehr spezialisiert sind.

Sie könnten in den atScheduler schauen . Es ist cronin gewisser Weise ähnlich, aber es ist eher wie eine Warteschlange für einmalige Jobs als für Wiederholungsjobs eingerichtet. Es kann Dinge nach anderen Kriterien als der Zeit "planen", wie z. B. Systemlast oder Abfolge von Jobs.

Ihre Lieblingsdistribution wird mit ziemlicher Sicherheit Pakete dafür haben.

Caleb
quelle
2

Ich stelle fest, dass diese Frage mehrere Jahre alt ist, daher hilft sie möglicherweise nicht dem Originalplakat, aber möglicherweise jemand anderem.

Erstens: "Task Spooler" ist die Antwort. Es ist ziemlich mächtig und Fedora hat es zumindest.

Aber viele der Server, die ich benutze, können keine beliebigen Pakete ohne großen Aufwand installieren, daher brauche ich etwas, das idealerweise reine Bash (oder Perl oder so) ist.

Nachdem ich eine Weile damit zu kämpfen hatte, kam ich auf eine reine Bash-Implementierung, die bisher gut zu funktionieren scheint. Sie finden es unter https://github.com/sitaramc/bq .

Es ist nur ein Bash-Skript, daher ist die Installation trivial. Es übertrifft jedoch Ihre zweite und dritte Anforderung (aber es sollte trivial sein, diese auch zu implementieren).

Das Skript ist großzügig kommentiert und Sie sollten es in wenigen Minuten überprüfen können, wenn Sie möchten.

Sitaram
quelle
Das Debian-Paket ist ein Task-Spooler, die ausführbare Datei ist "tsp" anstelle von "ts", die mit etwas anderem kollidierten. Ich mag es auch, weil Sie Aufgaben, die sich in der Warteschlange befinden, neu anordnen können, das können Sie mit at / batch nicht tun.
Ergosys