bash:在后台处理多个进程时,确保从stdout写入文件一次一行

时间:2013-08-13 21:26:47

标签: bash io-redirection

我有以下脚本:

loop=0
for did in $(echo "$dids")
do
    echo "$did"
    loop=$((loop+1))
    if [ $loop -lt 10 ] ; then
        ./account_locate_by_phonenumber.sh "$did" 2>/dev/null >>accounts.csv &
    else
        wait
        #make sure to call locate script again or we'll skip this phone number
        ./account_locate_by_phonenumber.sh "$did" 2>/dev/null >>accounts.csv &
        loop=0
    fi
done

它正在调用另一个脚本     account_locate_by_phonenumber.sh 它通过ssh从远程mysql服务器获取结果。

如果我没有后台调用该脚本,我没有问题。后台调用时会出现问题。我目前进行十次迭代,然后调用wait以暂时暂停并且不会完全压倒远程服务器。写入的大多数行都很好,但每隔一段时间(10-50行之间)就会同时写入两行,并且输出都是混合的。

我假设我需要以某种方式捕获输入,然后立即将其全部写入,或者每组迭代,但是我要知道如何做到这一点。

2 个答案:

答案 0 :(得分:2)

将每个迭代的输出写入另一个文件并连接它们。

loop=0
for did in $(echo "$dids")
do
    echo "$did"
    loop=$((loop+1))
    if [ $loop -lt 10 ] ; then
        ./account_locate_by_phonenumber.sh "$did" 2>/dev/null >accounts.csv.$loop &
    else
        wait
        cat accounts.csv.* >> accounts.csv
        rm accounts.csv.*
        #make sure to call locate script again or we'll skip this phone number
        ./account_locate_by_phonenumber.sh "$did" 2>/dev/null >accounts.csv.0 &
        loop=0
    fi
done
wait
cat accounts.csv.* >> accounts.csv

答案 1 :(得分:1)

如果你想在这里使用Bash ......怎么样:

  • 您将输出写入10个单独编号的csv文件
  • 替换等待所有csv文件填充的时间间隔等待
  • 在第10次迭代后添加合并脚本,将所有csv文件推送到主account.csv

否则,我建议使用对多个线程有更多库支持的语言。