Простая система очередей?

10

Учитывая наличие обычного ПК, мы хотели бы использовать его для круглосуточного выполнения некоторых задач в фоновом режиме.

По сути, мы хотели бы иметь такие команды, как:

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

Добавленные задачи должны просто помещаться в очередь и выполняться одна за другой в фоновом режиме (продолжая работать после выхода из оболочки).

Есть ли простой скрипт / программа, которая делает это?

dagnelies
источник

Ответы:

7

Есть стандартная batchкоманда, которая делает более или менее то, что вам нужно. Точнее, batchвыполняет задания, когда нагрузка на систему не слишком высока, по одному (поэтому он не выполняет распараллеливание). Команда batchявляется частью atпакета.

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)
Жиль "ТАК - перестань быть злым"
источник
Неверно говорить, что batchкоманда «не выполняет распараллеливание». Обычно между стартом одной работы и следующей начинается задержка в 60 секунд; однако нет ничего, что заставляло бы следующее задание ждать завершения первого - оно с atdрадостью удалит задания из очереди пакета, как только истечет значение, заданное -bпараметром (см. atdсправочную страницу).
rsaw
Пакет не строго сериализует задачи, поэтому, если у вас есть один общий ресурс, ответ @sitaram (диспетчер задач) должен работать лучше.
ergosys
5

Другим решением является использование lpdи создание собственного «драйвера печати», который запускает ваши задания. Друг помог мне разобраться, когда у меня была похожая просьба. Сделайте такой скрипт и вставьте его в /tmp/batch.sh:

#!/bin/bash

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

Затем запустите:

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

Это запускает очередь, и вы можете создать больше, используя другие имена вместо batch1. Добавить работу с:

lp -d batch1 /path/to/jobscript

Управление заданий с lpq, lprmи lpstat. Если вам нужна большая гибкость при передаче аргументов вашим рабочим местам, вы можете сделать скрипт batch.sh более привлекательным.

(Я пробовал, batchпрежде чем идти по этому пути, но либо он не работает как очередь в OSX, либо я использовал его неправильно.)

Джо Фьюжн
источник
Я понимаю, что @arnaud указал «обычный ПК», что означает, что это, вероятно, не OSX, где я тестировал это решение. Тем не менее, это должно быть переносимым и гораздо более гибким, чем batch.
Джо Фьюжн
1
Это возможно один из самых настоящих хаков, которые я когда-либо видел.
Тьяго Маседо
К сожалению, это больше не работает. github.com/apple/cups/commit/…
wdkrnls
4

Существует множество систем массового обслуживания, но зачастую они очень специализированы.

Вы можете посмотреть в atпланировщик. В cronнекотором смысле это похоже на очередь для однократных заданий, а не для повторных. Он может «планировать» вещи по критериям, отличным от времени, таким как загрузка системы или последовательность заданий.

Ваш любимый дистрибутив почти наверняка будет иметь пакеты для него.

Калеб
источник
2

Я заметил, что этому вопросу уже несколько лет, поэтому он может не помочь оригинальному постеру, но может помочь кому-то еще.

Первое: «диспетчер задач» - это ответ. Он довольно мощный, и, по крайней мере, у Fedora.

Но на многих серверах, которые я использую, я не могу устанавливать произвольные пакеты без особых хлопот, поэтому мне нужно что-то идеально идеально bash (или perl, или такой).

Поработав с этим некоторое время, я пришел к чистой реализации bash, которая до сих пор работала нормально. Вы можете найти его по адресу https://github.com/sitaramc/bq .

Это всего лишь один сценарий bash, поэтому установка тривиальна. Тем не менее, это накладывает на ваши вторые и третьи требования (но это тоже должно быть тривиально).

Сценарий подробно прокомментирован, и вы сможете просмотреть его через несколько минут, если хотите.

Ситарам
источник
Пакет debian - это диспетчер задач, исполняемый файл - "tsp", а не "ts", что конфликтует с чем-то другим. Мне это нравится также потому, что вы можете переупорядочивать задачи, которые находятся в очереди, вы не можете сделать это с помощью / batch.
ergosys