Минимальная “Очередь Задачи” с инструментами Linux запаса для усиления Многоядерного ЦП

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

У меня есть файл с 9'000 строками, каждая строка имеет командную строку удара, команды абсолютно независимы.

command 1 > Logs/1.log
command 2 > Logs/2.log
command 3 > Logs/3.log
...

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

Было бы хорошо, если бы решение имело следующие функции:

  • может интерпретировать больше чем одну команду (например. command; command)
  • может интерпретировать потоковые перенаправления на строках (например. ls > /tmp/ls.txt)
  • только использует общие инструменты Linux

Бонусные очки, если это работает над другими клонами Unix без слишком экзотических требований.

7
задан Manuel 6 May 2009 в 23:14
поделиться

6 ответов

Можете ли вы преобразовать свой список команд в Makefile? Если это так, вы можете просто запустить «make -j X».

14
ответ дан 6 December 2019 в 07:52
поделиться

Подобное удовольствие от распределенных вычислений - это Mapreduce Bash Script:

http://blog.last.fm/2009/04/06/mapreduce-bash-script

И спасибо, что указали на ppss!

0
ответ дан 6 December 2019 в 07:52
поделиться

You can use the xargs command, its --max-procs does what you want. For instance Charlie Martin solution becomes with xargs:

tr '\012' '\000' <mycommands.sh |xargs --null --max-procs=$X bash -c

details:

  • X is the number of processes max. E.g: X=15. --max-procs is doing the magic
  • the first tr is here to terminate lines by null bytes for xargs --null option so that quotes redirection etc are not expansed wrongly
  • bash -c runs the command

I tested it with this mycommands.sh file for instance:

date
date "+%Y-%m-%d" >"The Date".txt
wc -c <'The Date'.txt >'The Count'.txt
0
ответ дан 6 December 2019 в 07:52
поделиться

Хорошо, разместив здесь вопрос, я нашел следующий проект, который выглядит многообещающим: ppss .

Редактировать: Не совсем то, что я хочу, PPSS сосредоточен на обработка "всех файлов в каталоге A".

0
ответ дан 6 December 2019 в 07:52
поделиться

Ну, в любом случае, это довольно забавный вопрос.

Вот что я бы сделал, если предположить, конечно, bash (1) .

  • выяснить сколько из этих команд можно успешно запускать одновременно. Это будет не просто количество ядер; многие команды будут приостановлены из-за ввода-вывода и тому подобного. Например, позвоните по этому номеру N. N = 15
  • устанавливает обработчик сигнала прерывания для сигнала SIGCHLD, который возникает при завершении дочернего процесса. trap signalHandler SIGCHLD
  • пересылает ваш список команд в конвейер
  • записывает цикл, который читает стандартный ввод и выполняет команды одну за другой, уменьшая счетчик. Когда счетчик равен 0, он ждет с.
  • ваш обработчик сигнала, который работает на SIGCHLD, увеличивает этот счетчик.

Итак, теперь, он выполняет первые N команд, а затем ждет. Когда первый дочерний элемент завершается, ожидание возвращается, он читает другую строку, запускает новую команду и снова ждет.

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

 N=15
 COUNT=N
 cat mycommands.sh | 
 while read cmd 
 do
   eval $cmd &
   if $((count-- == 0))
   then
       wait
   fi
 od

Теперь эта команда запускает первые 15 команд, а затем запускает остальные по одной, когда некоторая команда завершается.

0
ответ дан 6 December 2019 в 07:52
поделиться

Это особый случай, но если вы пытаетесь обработать набор файлов и создать другой набор выходных файлов, вы можете запустить #cores количество процессов и проверить, есть ли выходной файл существует до его обработки. В приведенном ниже примере каталог с файлами .m4b преобразуется в файлы .mp3:

Просто запустите эту команду столько раз, сколько у вас есть ядер:

ls * m4b | while read f; выполнить тест -f $ {f% m4b} mp3 || mencoder -of rawaudio "$ f" -oac mp3lame -ovc copy -o $ {f% m4b} mp3; готово &

0
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: