祝福所有人。我正在设置一个cron作业来执行一个bash脚本,我担心下一个可能会在前一个脚本结束之前启动。一个小小的谷歌搜索显示,一种流行的解决方法是flock
命令,用于以下方式:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
这很有效。但是,如果我想查看myscript.sh
的退出代码,该怎么办?它返回的退出代码将被flock
覆盖,所以我无法知道它是否成功执行。
答案 0 :(得分:6)
看起来您可以使用flock
,flock <fd>
的替代形式,其中<fd>
是文件描述符。如果你把它放到子shell中,并将该文件描述符重定向到你的锁文件,那么flock将等到它可以写入该文件(如果它无法立即打开它并且你已经通过{{1}则错误输出})。然后,您可以在子shell中执行所有操作,包括测试运行的脚本的返回值:
-n
答案 1 :(得分:0)
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
如果我理解你的话,你想确保在cron再次尝试运行你的命令之前'myscript.sh'没有运行。假设是正确的,我们检查pgrep是否在进程列表中找不到myscript.sh,如果是,我们再次运行flock命令。
答案 2 :(得分:0)
也许这样的事情对你有用。
#!/bin/bash
RETVAL=0
lockfailed()
{
echo "cannot flock"
exit 1
}
(
flock -w 2 42 || lockfailed
false
RETVAL=$?
echo "original retval $RETVAL"
exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL