如何在bash for循环中将程序启动到后台

时间:2013-07-01 21:39:06

标签: bash

以下脚本片段为选项卡中的每个条目启动shell脚本sqoopToHdfs.sh一次,但是按顺序执行:

tabs="contracts employees resources"
for t in $tabs; do /shared/sqoopToHdfs.sh $t >$t.out 2>&1 ; done

但是以下尝试同时启动所有这些工作:

for t in $tabs; do /shared/sqoopToHdfs.sh $t >$t.out 2>&1 **&**; done

那么在背景中启动的正确语法与for循环兼容(或实现相同的效果)是什么?

4 个答案:

答案 0 :(得分:2)

失去;

for t in $tabs; do /shared/sqoopToHdfs.sh $t >$t.out 2>&1 & done

答案 1 :(得分:2)

如果你想在一行上写它:(在&符号后面没有分号):

for t in $tabs; do /shared/sqoopToHdfs.sh $t > $t.out 2>&1 & done
不过,您应该使用更强大的语法和数组:

tabs=( contracts employees resources)
for t in "${tabs[@]}"; do /shared/sqoopToHdfs.sh "$t" > "$t.out" 2>&1 & done

或(它完全一样):

tabs=( contracts employees resources)
for t in "${tabs[@]}"; do
    /shared/sqoopToHdfs.sh "$t" > "$t.out" 2>&1 &
done

(使用这种形式,你从来没有遇到过问题!)

答案 2 :(得分:2)

在最后添加&

for t in $tabs; do /shared/sqoopToHdfs.sh $t >$t.out 2>&1 & done

我不知道你希望这些运行多长时间,但它们都将被绑定到终端,你可以在这样做之后废弃这个过程,以便在你关闭那个终端时让它们保持活着

disown PID

答案 3 :(得分:1)

怎么样:

 pins=""
 for t in $tabs; do 
    nohup /shared/sqoopToHdfs.sh $t >$t.out 2>&1 & 
    pins="$!,$pins"
 done