Я не очень уверен в этом, но Вы могли также использовать cgroups для ограничения использования памяти. Преимущество cgroups состоит в том, что можно управлять процессами, которые уже работают. По тому, как systemd будет использовать cgroups для управления системными службами.
К сожалению, я экспериментировал немного, и они, кажется, не работают очень хорошо над моей системой Fedora 13.
Существует стандарт 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)
Существует много систем массового обслуживания, но часто очень специализированного.
Вы могли бы изучить at
планировщик. Это похоже cron
до некоторой степени, но это - установка больше как очередь для заданий времени, чем для повторных заданий. Это может "запланировать" вещи на критерии кроме времени, такие как системная нагрузка или последовательность заданий.
Ваш любимый дистрибутив будет почти наверняка иметь пакеты для него.
Другое решение состоит в том, чтобы использовать 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, или я использовал его неправильно.)
batch
.
– Joe Fusion
28.01.2014, 21:35
Я заметил, что этому вопросу уже несколько лет, поэтому он может не помочь оригинальному плакату, но может помочь кому-то другому.
Первый :"диспетчер очереди задач" - это ответ. Он довольно мощный и есть в большинстве дистрибутивов Linux и Homebrew.
Но на многих серверах, которые я использую, я не могу устанавливать произвольные пакеты без особых хлопот, поэтому мне нужно что-то идеально чистое bash (или perl или подобное ).
После того, как я некоторое время боролся с этим, я придумал чистую реализацию bash, которая до сих пор работает нормально. Вы можете найти его по адресу https://github.com/sitaramc/notes/blob/master/bq, с документацией .
Это всего лишь один bash-скрипт, так что установка не составляет труда. Тем не менее, это нарушает ваши вторые и третьи требования (, но их реализация также должна быть тривиальной ).
Сценарий подробно прокомментирован, и вы сможете просмотреть его через несколько минут, если захотите.
batch
команда "не делает никакого распараллеливания". Обычно существует значение по умолчанию задержка 60 секунд между запуском одного задания и запуском следующего; однако, нет ничего, чтобы заставить следующее задание ожидать первого для окончания-atd
счастливо начнет задания от пакетной очереди как только набор значений-b
опция протекла (см.atd
страница справочника). – rsaw 27.04.2016, 00:35