Назад | Перейти на главную страницу

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

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

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

parallel: Warning: Input is read from the terminal. Only experts do this on purpose. Press CTRL-D to exit.

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

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 игнорировать значения во входной последовательности. Все, что нас волнует, - это длина последовательности, а не ее содержимое. Даже если цифры не используются, команда все равно будет выполнена десять раз.

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

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

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

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

Сравнить с:

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

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

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

Вы читали примеры в руководстве? В частности https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Run-the-same-command-10-times