2011-03-08 27 views
29

Quiero empezar 100 procesos en bash, pero la declaración for no parece que le gusta el símbolo & y yo estoy poniendo un error de sintaxis, esto es lo que tengo hasta ahora:Cómo poner en marcha varios procesos en Bash

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

EDIT: me copypasting este código, por eso el & carbón era ilegal.

+0

Esto no debe ser la causa de un error de sintaxis. ¿Quizás pueda pegar todo el script y my_script.py y podamos ver si podría ser algo más? –

+0

Eso me parece bien ... –

+0

¿Qué error? Funciona para mí. ¿Qué versión de bash ?. – Zimbabao

Respuesta

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

¿Qué? Los puntos y comas son redundantes, y no estoy seguro de cuál sería el efecto de paréntesis aquí, dado que el fragmento de código de OP es sintácticamente válido. –

+11

Lo bueno de escribir de esa manera es que puedes copiar el código en el shell interactivo, ejecutarlo allí - no funciona sin poner la llamada my_script en una lista de expresiones y los puntos y comas.Puede ser redundante, pero tiene sus razones. ¡Sospeché que OP podría haber intentado esto en el modo interactivo del shell, dado que no proporcionó un script con un #! – datenwolf

+0

Encerrando la llamada entre() hizo el corte !! Gracias, – fcm

0

Como han notado otros, su fragmento es un código válido.

No estoy seguro si esto es lo que necesita ... pero se puede bifurcar en dos ocasiones:

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

Esto permitirá que su secuencia de comandos ejecutada incluso si la cáscara se launced de se destruye.

+0

Esto no aborda la pregunta. –

3

La única razón por la que puedo pensar por qué esto no funcionaría es si realmente estaba usando algún otro shell, como /bin/sh.

¿Tiene #!/bin/bash en la parte superior de su archivo? En caso afirmativo, cámbielo a #!/bin/bash -x (para activar el rastreo, o xtrace como se llama en la página del manual) y pegue el resultado relevante en su pregunta, junto con el error de sintaxis exacto que está ocurriendo. Si no, ese podría ser su problema. ;-)

La otra posibilidad que se me ocurre es si tiene ^M caracteres (terminaciones de línea de DOS) en su archivo, lo que puede generar errores como los siguientes (dependiendo de la línea en la que se encuentren, si son esparcidos alrededor, o dependiendo de si el guión comienza con una línea #!):

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

This page tiene un buen fragmento de perl que puede eliminarlos, de la siguiente manera (que he modificado ligeramente para que funcione en el caso poco probable que tiene un ^M extraviado en el medio de una línea):

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

Con GNU Paralelo que puede hacer:

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

Sin -j0 se generará un proceso por la CPU.

Mira los vídeos de introducción para más detalles: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

+1

¡esta debería ser la mejor respuesta! –

Cuestiones relacionadas