0

我有以下脚本:

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行之间)就会同时写两行,并且输出都混在一起了。

我假设我需要以某种方式捕获输入,然后一次全部写入,或者每组迭代,但我对如何做到这一点一无所知。

4

2 回答 2

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
于 2013-08-13T21:39:13.563 回答
1

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

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

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

于 2013-08-13T21:37:02.057 回答