【问题标题】:Tailing multiple files in the background with bash使用 bash 在后台拖尾多个文件
【发布时间】:2014-07-16 04:50:43
【问题描述】:

我从来没有在 bash 中写过这么激烈的东西。基本上,我想并行运行有限数量的数据导入脚本。为此,我需要知道一个何时终止以便开始下一个。但是,我不确定如何并行执行此操作。以下同步工作:

# watch the outputfile for "DONE!"
tail -f $outputfile | while read OUTPUT
do
  if [[ "${OUTPUT}" == *"DONE!"* ]]
  then
    runNextScript
  fi
done

如何异步运行?

【问题讨论】:

标签: bash automation background-process tail watch


【解决方案1】:

基本上,我想在 平行。为此,我需要知道一个人何时终止,以便 开始下一个。

一种方法是创建一个包含与最大并发脚本数一样多的令牌的先进先出。

然后,在启动任务之前,首先消耗一个令牌,实际启动任务,最后将令牌放回fifo中。这样,当达到最大工作脚本数时,下一个将被阻止,直到令牌可用。

不清楚?这是一个概念证明(你肯定必须适应你的需求!):

  • master.sh
#!/bin/bash

rm -f fifo
mkfifo fifo

exec 3<>fifo

# Simulate 26 tasks
tasks=$(exec echo {a..z})

#insert 5 tokens in the fifo
#that is at max 5 worker working at the same time
for i in {1..5}; do
    (echo T >&3; echo Insert token) &
done

# launch the tasks when a token is available
for i in $tasks; do
    read <&3
    ( ./worker.sh $i; echo T >&3 ) &
done

wait
  • worker.sh(没什么兴趣:模拟做一些事情)

#!/bin/bash

# simulate doing some stuff
S=$(( RANDOM % 10 ))
echo "$(exec date +%s) PID$$ doing task $1 for $S"
sleep $S

以下是会议记录:

sh$ ./master.sh 
Insert token
Insert token
Insert token
Insert token
Insert token
1405456428 PID3039 doing task a for 0
1405456428 PID3041 doing task b for 0
1405456428 PID3046 doing task e for 5
1405456428 PID3043 doing task c for 5
1405456428 PID3045 doing task d for 8
1405456428 PID3055 doing task f for 4
1405456428 PID3057 doing task g for 0
1405456428 PID3066 doing task h for 6
1405456432 PID3070 doing task i for 2
1405456433 PID3074 doing task j for 3
1405456433 PID3077 doing task k for 0
1405456433 PID3082 doing task l for 9
1405456434 PID3086 doing task m for 3
1405456434 PID3089 doing task n for 5
1405456436 PID3094 doing task o for 7
1405456436 PID3097 doing task p for 7
1405456437 PID3102 doing task q for 2
1405456439 PID3106 doing task r for 3
1405456439 PID3109 doing task s for 3
1405456442 PID3114 doing task t for 7
1405456442 PID3118 doing task u for 5
1405456442 PID3121 doing task v for 7
1405456443 PID3126 doing task w for 9
1405456443 PID3129 doing task x for 3
1405456446 PID3134 doing task y for 9
1405456447 PID3138 doing task z for 1

总执行时间约为 20 秒,此时工作人员的总“工作时间”为 113 秒。如果我没记错的话,那个因子 5 对应于 5 个并行工作的工人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2017-11-08
    • 2012-09-03
    • 2021-02-08
    • 1970-01-01
    相关资源
    最近更新 更多