Подтвердить что ты не робот

Как запустить несколько процессов в Bash

Я хочу запустить 100 процессов в bash, но инструкция for не похожа на символ &, и я получаю синтаксическую ошибку, вот что я до сих пор:

echo "Spawning 100 processes"
for i in {1..100}
do
    ./my_script.py &
done

EDIT: Я копировал этот код, поэтому & char был незаконным.

4b9b3361

Ответ 1

echo "Spawning 100 processes"
for i in {1..100} ;
do
    ( ./my_script & )
; done

Ответ 2

С помощью GNU Parallel вы можете:

echo "Spawning 100 processes"
parallel -j0 ./my_script.py ::: {1..100}

Или, чтобы избежать аргументов с 1 по 100:

parallel -j0 -N0 ./my_script.py ::: {1..100}

Без -j0 он будет порождать один процесс на процессор.

Смотрите видеоролики интро для более подробной информации: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ответ 3

Единственная причина, по которой я могу думать о том, почему это не сработает, - это если вы действительно используете какую-либо другую оболочку, например /bin/sh.

У вас есть #!/bin/bash в верхней части файла? Если да, пожалуйста, измените его на #!/bin/bash -x (чтобы включить трассировку или xtrace, как она называется на странице руководства) и вставьте соответствующий вывод в свой вопрос вместе с точной синтаксической ошибкой, которая возникает. Если нет, это может быть вашей проблемой.; -)

Другая возможность, о которой я могу думать, - это иметь в своем файле символы ^M (окончание строк DOS), что может привести к ошибкам, таким как следующее (в зависимости от того, в какой строке они находятся, если они разбросаны вокруг, или в зависимости от того, начинается ли script с строки #!):

-bash: ./myscript.sh: /bin/bash^M: bad interpreter: No such file or directory
'/myscript.sh: line 2: syntax error near unexpected token `do

Эта страница содержит хороший фрагмент perl, который может удалить их, как показано ниже (который я немного изменил, чтобы он работал в маловероятном случае что у вас есть блуждающий ^M в середине строки):

perl -pi -e 's/\r//g' myscript.sh

Ответ 4

В этом примере мы имеем 2 параллельных процесса, основанных на разных аргументах (числах)

my_array=(1 2 3 4); printf '%s\n' "${my_array[@]}" | parallel -j 2 "echo {} &"

Вы можете заменить my_array на то, что генерирует вывод для команды echo (например: find *tif -printf "%f\n")

Если также можно использовать nohup чтобы предотвратить завершение обработки, когда вы закрываете сеанс ssh: nohup sh -c 'find *tif -printf "%f\n" | parallel -j 2 echo {}' & nohup sh -c 'find *tif -printf "%f\n" | parallel -j 2 echo {}' &

Ответ 5

Как отмечали другие, ваш фрагмент является допустимым кодом.

Не уверен, что это то, что вам нужно... но вы можете разворачивать дважды:

( ( /complete/path/my_script.py & ) & )

Это приведет к тому, что ваш script будет запущен, даже если оболочка, из которой она была запущена, была уничтожена.