《Shell高级编程案例精选(365例)》汇集了涵盖系统管理、自动化运维及脚本优化等方面的365个经典实例,旨在帮助读者掌握Shell脚本编程的深度与广度。
Shell脚本高级编程教程希望对你有所帮助。
示例10-23:使用continue N的实际任务:
阿尔伯特·莱纳尔提供了一个如何使用continue N的例子:
假设我有许多需要运行的任务,这些任务的数据文件遵循特定的命名模式,并位于一个目录中。有几台机器可以访问这个目录,我希望将工作分配到不同的机器上进行处理。通常在每台机器上nohup执行类似以下脚本:
```
while true
do
for n in .iso.*
do
[ $n = .iso.opts ] && continue
beta=${n#.iso.}
[ -r .Iso.$beta ] && continue
[ -r .lock.$beta ] && sleep 10 && continue
lockfile -r0 .lock.$beta || continue
echo -n $beta: `date`
run-isotherm $beta
date
ls -alF .Iso.$beta
[ -r .Iso.$beta ] && rm -f .lock.$beta
continue 2
done
break
done
```
细节部分,特别是sleep N的部分,根据我的应用需求而定。但总体模式是:
```
while true
do
for job in {pattern}
do
{job already done or running} && continue
{mark job as running, do job, mark job as done}
continue 2
done
break # 或者使用类似`sleep 600来避免终止。
done
```
这样,脚本将仅在没有更多任务可执行时停止(包括运行期间添加的任务)。通过适当锁定文件的使用,可以在多台机器上并行运行而不会重复计算(在我的情况下这些计算会持续几个小时,所以我不想让它们被重复)。同时由于搜索总是从头开始进行,可以编码优先级到文件名中。当然也可以不使用`continue 2`,但那样的话就必须检查任务是否已完成(以便立即寻找下一个任务)或未完成(在这种情况下需要终止或者长时间睡眠后再检查新任务)。