我每天都有24小时日志的数据。 greying所需的字符串数据非常庞大,所有24小时目录中搜索字符串需要3个小时。 减少消耗时间我决定将24小时分成三个部分,并希望使用&
在后台平行执行每个部分cat test.sh
log1="22 01 02 03 04 05 06 21"
log2="07 08 09 10 11 12 13 22"
log3="14 15 16 17 18 19 20 23"
for me in $log1
do
for me1 in $me
do
cd $me1
$(cat * | grep ASS-va1appus06-1480458532238-14424 | grep -i "am/agent/registered" &) >../log\_$me1 &
cd ..
done
done
这里的问题没有按预期工作。没有运行后台而没有更新日志文件,脚本没有进一步处理。
some of the script output is
+ cd 22
+ cd ..
++ grep ASS-va1appus06-1480458532238-14424
++ grep -i am/agent/registered
++ cat logfile.log1 logfile.log2 .......
如果你看到命令没有按照给定的grep序列执行,
答案 0 :(得分:1)
你错误地设计了你的并行调用,并将并行的代码与主脚本中的调用混合在一起。您可以尝试以下方法:
#!/bin/bash
log1="22 01 02 03 04 05 06 21"
log2="07 08 09 10 11 12 13 22"
log3="14 15 16 17 18 19 20 23"
for me in $log1
do
for me1 in $me
do
# you could aslo get rid of the cd altogether
# (grep "ASS-va1appus06-1480458532238-14424" $me1/* | grep -i "am/agent/registered" >log\_$me1) &
(cd $me1 && grep "ASS-va1appus06-1480458532238-14424" * | grep -i "am/agent/registered" >../log\_$me1) &
done
done
(...)
表示我们在子shell中执行指令。变量声明或cd
之类的更改在此上下文中有效,但不会影响我们的主脚本环境。
关于你的脚本的一些注意事项:我删除了useless use of cat,在使用并行计算时也要注意同一文件中的concurent写入。