7

Я хочу, чтобы возможность планировать команды для запуска в очереди FIFO. Я не хочу, чтобы они запускались в указанное время в будущем, как в случае с командой "at". Я хочу, чтобы они начали работать сейчас, но не одновременно. Следующая запланированная команда в очереди должна быть выполнена только после завершения выполнения первой команды. В качестве альтернативы было бы неплохо, если бы я мог указать максимальное количество команд из очереди, которые могли бы выполняться одновременно; например, если максимальное число одновременных команд равно 2, то только не более 2 команд, запланированных в очереди, будут взяты из очереди способом FIFO для выполнения, при этом следующая команда в оставшейся очереди запускается только тогда, когда одна из в настоящее время 2 выполняющиеся команды заканчиваются.

Я слышал, что Task-Spooler может сделать что-то подобное, но этот пакет, похоже, не очень хорошо поддерживается / протестирован и не входит в стандартные репозитории Ubuntu (Ubuntu - то, что я использую). Если это лучшая альтернатива, дайте мне знать, и я буду использовать диспетчер задач, в противном случае мне будет интересно узнать, каков наилучший, самый простой, проверенный, не содержащий ошибок, канонический способ сделать такое с bash.

ОБНОВИТЬ:

Простые решения, такие как; или && из bash не работают. Мне нужно запланировать эти команды из внешней программы, когда происходит событие. Я просто не хочу, чтобы сотни экземпляров моей команды выполнялись одновременно, поэтому мне нужна очередь. Есть внешняя программа, которая будет запускать события, где я могу запускать свои собственные команды. Я хочу обрабатывать ВСЕ инициируемые события, я не хочу пропустить ни одного события, но я также не хочу, чтобы моя система зависала, поэтому я хочу, чтобы очередь обрабатывала мои команды, запущенные из внешней программы.

7 ответов7

16

Диспетчер задач:

http://vicerveza.homeunix.net/~viric/soft/ts/

https://launchpad.net/ubuntu/+source/task-spooler/0.7.3-1

Делает трюк очень хорошо. Надеюсь, он будет включен в репозиторий Ubuntu.

4

Использование ;

Например:
ls ; touch test ; ls

Это будет список каталога. Только после запуска ls он запустит touch test который создаст файл с именем test. И только после этого будет запущена следующая команда. (В этом случае другой ls который покажет старое содержимое и вновь созданный файл).

Подобные команды || и && .

; всегда будет запускать следующую команду.

&& будет запускать только следующую команду при первом возвращенном успехе.
Пример: rm -rf *.mp3 && echo "Success! All MP3s deleted!"

|| Следующая команда будет выполняться только в том случае, если первая команда вернула ошибочное (ненулевое) возвращаемое значение. Пример: rm -rf *.mp3 || echo "Error! Some files could not be deleted! Check permissions!"

Если вы хотите выполнить команду в фоновом режиме, добавьте амперсанд (&).
Пример:
make bzimage &
mp3blaster sound.mp3
make mytestsoftware ; ls ; firefox ; make clean

Запустит две команды в фоновом режиме (в этом случае сборка ядра, которая займет некоторое время, и программу для воспроизведения музыки). И на переднем плане он запускает другую задачу компиляции и, как только она будет завершена, ls, firefox и make clean (все последовательно)

Для более подробной информации смотрите man bash


[Изменить после комментария]

в псевдокоде, что-то вроде этого?


Program run_queue:

While(true)
{
   Wait_for_a_signal();

   While( queue not empty )
   {
       run next command from the queue.
       remove this command from the queue.
       // If commands where added to the queue during execution then
       // the queue is not empty, keep processing them all.
   }
   // Queue is now empty, returning to wait_for_a_signal
}
// 
// Wait forever on commands and add them to a queue
// Signal run_quueu when something gets added.
//
program add_to_queue()
{
   While(true)
   {
       Wait_for_event();
       Append command to queue
       signal run_queue
   }    
}
2

Самый простой способ - просто запустить команды последовательно:

cmd1; cmd2; cmd3; cmdN

Если вы хотите, чтобы следующая команда выполнялась только в случае успешного завершения предыдущей команды, используйте &&:

cmd1 && cmd2 && cmd3 && cmdN

Это единственный родной способ работы с Bash, который я знаю, делать то, что вы хотите. Если вам нужен контроль заданий (настройка количества параллельных заданий и т.д.), Вы можете попробовать установить диспетчер очередей, например TORQUE, но это кажется излишним, если все, что вы хотите сделать, это запускать задания последовательно.

1

Вы ищете брат at «s близнеца: batch Он использует тот же демон, но вместо того, чтобы планировать определенное время, задания ставятся в очередь и будут запускаться всякий раз, когда средняя загрузка системы низкая.

0

За исключением диспетчера задач, я буквально не нашел ничего другого, что бы удовлетворить эту потребность. Tsp - это здорово, но я не всегда могу компилировать или устанавливать на каждом сервере, с которым мне нужно работать.

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

Bq использует тот факт, что в Unix "mv" (в пределах одной и той же файловой системы) является атомарной операцией для всех ее потребностей в блокировке.

Это всего лишь один сценарий bash, поэтому установка тривиальна.

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

0

Помимо специализированных систем массового обслуживания (таких как Sun Grid Engine), которые вы также можете использовать локально на одной машине и которые предлагают десятки возможностей, вы можете использовать что-то вроде

 command1 && command2 && command3

что является другой крайностью - очень простой подход. Последний не обеспечивает ни одновременных процессов, ни постепенного заполнения "очереди".

0

Я пошел по тому же маршруту в поисках, опробовал диспетчер задач и так далее. Лучшие из лучших это:

GNU Parallel --semaphore --fg У него также есть -j для параллельных заданий.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .