如何在Bash中启动多个进程

时间:2011-03-08 20:43:47

标签: bash

我想在bash中启动100个进程,但for语句似乎不喜欢&符号,我收到语法错误,这就是我到目前为止:

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

编辑:我正在编写此代码,这就是为什么&字符是非​​法的。

5 个答案:

答案 0 :(得分:50)

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

答案 1 :(得分:13)

使用GNU Parallel,您可以:

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

或者避免参数1到100:

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

如果没有-j0,它将为每个CPU产生一个进程。

观看介绍视频了解更多详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

答案 2 :(得分:3)

我能想到为什么这不起作用的唯一原因是你真的在使用其他shell,比如/bin/sh

您的文件顶部是否有#!/bin/bash?如果是,请将其更改为#!/bin/bash -x(打开跟踪,或者在手册页中调用 xtrace )并将相关输出粘贴到您的问题中,并附带确切的语法错误正在发生。如果不是,那可能是你的问题。 ; - )

我能想到的另一种可能性是你的文件中有^M个字符(DOS行结尾),这可能会导致如下错误(取决于它们所在的行,如果它们是散布在周围,或取决于脚本是否以#!行开头):

-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有一个很好的perl片段,可以删除它们,如下所示(我稍微修改过,因此它会在不太可能的情况下工作,因为你在一行中间有一个迷路^M ):

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

答案 3 :(得分:1)

在此示例中,我们基于不同的参数(数字)有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 {}' &

答案 4 :(得分:0)

正如其他人所说,您的代码段是有效的代码。

不确定这是否是你需要的......但你可以分叉两次:

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

这将使你的脚本运行,即使它被摧毁的shell被破坏了。