【发布时间】:2015-10-21 18:30:43
【问题描述】:
我想使用flock 来确保在任何给定时间只运行一次脚本实例。
脚本骨架如下所示:
ME=`basename "$0"`;
LOCK="/tmp/${ME}.LCK";
exec 8>$LOCK;
if flock -n -x 8; then
do things
if [ condition ]; then
/path/asterisk_restart.sh
fi
else
echo "$(date) script already running >> $log_file"
fi
现在脚本/path/asterisk_restart.sh做了很多事情,但最后星号停止了,最后一个命令是service asterisk start
问题是这样的:由于文件句柄和锁在fork()/exec() 之间共享,8 个文件句柄仍然锁定在星号进程中,因此一旦执行/path/asterisk_restart.sh,脚本将不会再次运行(并且星号不会停止/重新启动此脚本之外的其他方式)
所以我的方法是在执行/path/asterisk_restart.sh之前启动子shell并关闭8个文件句柄。
看起来像这样:
ME=`basename "$0"`;
LOCK="/tmp/${ME}.LCK";
exec 8>$LOCK;
if flock -n -x 8; then
do things
if [ condition ]; then
(
exec 8>&-
/path/asterisk_restart.sh
)
fi
else
echo "$(date) script already running >> $log_file"
fi
这是一种合理的方法吗?
【问题讨论】: