Système de mise en file d'attente simple?


10

Étant donné un PC de base, nous aimerions l'utiliser pour exécuter certaines tâches en arrière-plan 24h / 24.

Fondamentalement, nous aimerions avoir des commandes comme:

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

Les tâches ajoutées doivent simplement être placées dans une file d'attente et exécutées l'une après l'autre en arrière-plan (en continuant à fonctionner après la déconnexion du shell).

Y a-t-il un script / programme simple qui fait cela?

Réponses:


7

Il existe une batchcommande standard qui fait plus ou moins ce que vous recherchez. Plus précisément, batchexécute les tâches lorsque la charge du système n'est pas trop élevée, une à la fois (donc elle ne fait aucune parallélisation). La batchcommande fait partie du atpackage.

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)

Il est faux de dire que la batchcommande "ne fait aucune parallélisation". Il y a généralement un délai par défaut de 60 secondes entre le démarrage d'un travail et le démarrage du suivant; cependant, rien ne fait attendre le prochain travail que le premier se termine - il atdlancera volontiers les travaux de la file d'attente par lots dès que la valeur définie par l' -boption sera écoulée (voir la atdpage de manuel).
rsaw

Batch ne sérialise pas strictement les tâches, donc si vous avez une seule ressource partagée, la réponse de @sitaram (spouleur de tâches) devrait mieux fonctionner.
ergosys

5

Une autre solution consiste à utiliser lpdet à créer un "pilote d'impression" personnalisé qui exécute vos travaux. Un ami m'a aidé à résoudre ce problème lorsque j'ai eu une demande similaire. Faites un script comme celui-ci et mettez-le /tmp/batch.sh:

#!/bin/bash

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

Exécutez ensuite:

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

Cela démarre une file d'attente et vous pouvez en créer d'autres en utilisant d'autres noms au lieu de batch1. Ajoutez un emploi avec:

lp -d batch1 /path/to/jobscript

Gérer les emplois avec lpq, lprmet lpstat. Si vous voulez plus de flexibilité en passant des arguments à vos jobs, vous pouvez rendre le script batch.sh plus sophistiqué.

(J'ai essayé batchavant de suivre cette voie, mais soit cela ne fonctionne pas comme une file d'attente sur OSX, soit je l'utilisais mal.)


Je me rends compte que @arnaud a spécifié "PC de base", ce qui signifie que ce n'est probablement pas OSX, où j'ai testé cette solution. Cependant, cela devrait être portable, et c'est beaucoup plus flexible que batch.
Joe Fusion

1
C'est peut-être l'un des hacks les plus authentiques que j'aie jamais vus.
Thiago Macedo

Malheureusement, cela ne semble plus fonctionner. github.com/apple/cups/commit/…
wdkrnls

4

Il existe de nombreux systèmes de files d'attente, mais ils sont souvent très spécialisés.

Vous pourriez regarder dans le atplanificateur. C'est comme cronà certains égards, mais il est configuré plus comme une file d'attente pour des travaux ponctuels que pour des travaux répétés. Il peut "planifier" des choses sur des critères autres que le temps, tels que la charge du système ou la séquence des travaux.

Votre distribution préférée aura presque certainement des packages pour cela.


2

Je remarque que cette question a plusieurs années, donc cela peut ne pas aider l'affiche originale, mais cela peut aider quelqu'un d'autre.

Premièrement: "spouleur de tâches" est la réponse. C'est assez puissant et Fedora l'a au moins.

Mais beaucoup de serveurs que j'utilise, je ne peux pas installer de paquets arbitraires sans trop de tracas, j'ai donc besoin de quelque chose qui est idéalement pur bash (ou perl, ou autre).

Après avoir lutté avec cela pendant un certain temps, j'ai trouvé une implémentation pure bash qui semble fonctionner correctement jusqu'à présent. Vous pouvez le trouver sur https://github.com/sitaramc/bq .

Ce n'est qu'un script bash, donc l'installation est triviale. Cependant, cela punit vos deuxième et troisième exigences (mais il devrait être trivial de les implémenter également).

Le script est largement commenté et vous devriez pouvoir le revoir en quelques minutes si vous le souhaitez.


le paquet debian est spouleur de tâches, l'exécutable est "tsp" au lieu de "ts" qui est entré en collision avec autre chose. Je l'aime aussi parce que vous pouvez réorganiser les tâches qui sont dans la file d'attente, vous ne pouvez pas le faire avec at / batch.
ergosys
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.