Использование параллельного запуска скрипта без ввода

10

Я пытаюсь запустить много экземпляров скрипта с GNU параллельно, но скрипт не принимает аргументов.

Если я просто выполню 'parallel foo.sh', я получу это:

parallel: Warning: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.
user1700840
источник

Ответы:

10

Предполагая, что вы хотите выполнить десять раз, этот синтаксис будет работать:

parallel -n0 foo.sh ::: {1..10}

parallelнужна входная последовательность некоторой длины ( ::: {1..10}) И вам нужно игнорировать содержимое входной последовательности ( -n0), вам важна только ее длина.

Ваша исходная команда: parallel foo.shне содержит входной последовательности, указывающей, какой параллелизм вы хотите. Загадочное предупреждение говорит вам, что parallelначнет слушать терминал на предмет последовательности ввода, и что это, вероятно, не то, что вы хотите.

Вот учебный пример:

seq 10 | parallel -n0 my_command my_args

Как это устроено:

  • parallelвсегда берет входную последовательность откуда-то. Это может быть встроенная последовательность, разделенная пробелами, перед которой :::ИЛИ последовательность, разделенная символом новой строки, из файла или файловоподобного источника, такого как канал. В этом примере входная последовательность из трубы.
  • seq 10 создает разделенную символом новой строки последовательность цифр от одной до десяти.
  • -n0Опция указывает параллельно игнорировать значения в последовательности ввода. Нам важна только длина последовательности, а не ее содержимое. Даже если цифры не используются, команда все равно будет выполнена десять раз.

Другой пример:

parallel -n0 echo -n 'x' ::: {1..5}

Как это устроено:

  • Входная последовательность встроена.
  • {1..5} производит разделенную пробелами последовательность цифр от одной до пяти.
  • -n0игнорирует значения последовательности (и 'x'вместо этого мы выводим строку каждый раз)
  • Вывод: xxxxx

По сравнению с:

parallel echo -n ::: {1..5}

Как это устроено:

  • Входная последовательность встроена.
  • {1..5} производит разделенную пробелами последовательность цифр от одной до пяти.
  • Каждое значение из входной последовательности используется в качестве аргумента для echo. Заказ не гарантирован.
  • Выход: 43215. Может быть любой заказ.
jwfearn
источник