我想在bash
中启动100个进程,但for
语句似乎不喜欢&
符号,我收到语法错误,这就是我到目前为止:
echo "Spawning 100 processes"
for i in {1..100}
do
./my_script.py &
done
编辑:我正在编写此代码,这就是为什么&
字符是非法的。
答案 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被破坏了。