如何检查flock执行的命令的退出代码?

时间:2009-12-26 20:35:59

标签: bash cron exit-code file-locking flock

祝福所有人。我正在设置一个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覆盖,所以我无法知道它是否成功执行。

3 个答案:

答案 0 :(得分:6)

看起来您可以使用flockflock <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