Можно ли использовать xargs для параллельного запуска нескольких произвольных команд?

Я хотел бы иметь возможность предоставить длинный список произвольных/разных команд (различные двоичные/исполняемые файлы и аргументы) и заставить xargs запускать эти команды параллельно (xargs -P).

Я могу использовать xargs -P нормально, когда только разные аргументы. Когда я хочу изменить исполняемый файл и аргументы, у меня возникают трудности.

Пример: команда-список.txt

% cat command-list.txt
binary_1 arg_A arg_B arg_C 
binary_2 arg_D arg_E
.... <lines deleted for brevity>
binary_100 arg_AAA arg_BBB

% xargs -a command-list.txt -P 4 -L 1
 ** I know the above command will only echo my command-list.txt **

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

Решение, вероятно, смотрит мне в лицо. Заранее спасибо!


person Charlie Hemlock    schedule 05.06.2013    source источник
comment
Описаны ли какие-либо причины отказа от использования GNU Parallel в oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html   -  person Ole Tange    schedule 05.06.2013
comment
У меня нет разрешения копировать GNU Parallel (или другое программное обеспечение) куда-либо в сеть, которую я использую в данный момент.   -  person Charlie Hemlock    schedule 06.06.2013


Ответы (1)


Если у вас нет доступа к parallel, одно из решений — просто использовать sh с вашей командой в качестве параметра.

Например:

xargs -a command-list.txt -P 4 -I COMMAND sh -c "COMMAND"

-c для sh в основном просто выполняет заданную строку (вместо поиска файла). Объяснение справочной страницы:

-c string   If  the  -c  option  is  present, then commands are read from
            string.  If there are arguments after the  string,  they  are
            assigned to the positional parameters, starting with $0.

И -I для xargs говорит ему запускать по одной команде за раз (например, -L 1) и искать и заменять параметр (КОМАНДА в данном случае) с текущей строкой, обрабатываемой xargs. Информация о справочной странице ниже:

-I replace-str
            Replace occurrences of replace-str in the initial-arguments with
            names read from standard input.  Also, unquoted  blanks  do  not
            terminate  input  items;  instead  the  separator is the newline
            character.  Implies -x and -L 1.

sh кажется очень щадящим с командами, содержащими кавычки (""), поэтому вам, похоже, не нужно превращать их в регулярные выражения в экранированные кавычки.

person inthecrossfire    schedule 22.11.2013