13
正确锁定外壳脚本?
有时,您必须确保同时运行一个Shell脚本实例。 例如,通过crond执行的cron作业本身并不提供锁定(例如,默认的Solaris crond)。 实施锁定的常见模式是这样的代码: #!/bin/sh LOCK=/var/tmp/mylock if [ -f $LOCK ]; then # 'test' -> race begin echo Job is already running\! exit 6 fi touch $LOCK # 'set' -> race end # do some work rm $LOCK 当然,这样的代码具有竞争条件。在一个时间窗口中,两个实例的执行都可以在第3行之后在一个实例能够触摸$LOCK文件之前进行。 对于cron作业,这通常不是问题,因为两次调用之间的间隔为几分钟。 但是事情可能会出错(例如,当锁文件位于NFS服务器上时)会挂起。在这种情况下,几个cron作业可以在第3行上阻塞并排队。如果NFS服务器再次处于活动状态,那么您将听到大量并行运行的作业。 在网上搜索时,我发现了锁运行工具,这似乎是解决该问题的好方法。使用它可以运行需要锁定的脚本,如下所示: $ lockrun --lockfile=/var/tmp/mylock myscript.sh 您可以将其放入包装器中,也可以从crontab中使用它。 lockf()如果可用,它将使用(POSIX),然后回退到flock()(BSD)。并lockf()支持NFS上应该是比较普遍的。 有替代品lockrun吗? 那其他的cron守护程序呢?有普通的crond支持健全的锁定吗?快速浏览Vixie …