Bash 如何检查flock执行的命令的退出代码?
大家好。我正在设置一个cron作业来执行bash脚本,我担心下一个作业可能会在前一个作业结束之前启动。通过谷歌搜索发现,解决这一问题的一种流行方法是Bash 如何检查flock执行的命令的退出代码?,bash,cron,exit-code,file-locking,flock,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
命令,使用方式如下:
flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
echo "Previous script is still running! Can't execute!"
fi
这很有效。但是,如果我想检查myscript.sh的退出代码,我该怎么办?它返回的任何退出代码都将被flock
覆盖,因此我无法知道它是否成功执行
#!/bin/bash
if ! pgrep myscript.sh; then
flock -n lockfile myscript.sh
fi
如果我没弄错的话,在cron再次尝试运行您的命令之前,您需要确保“myscript.sh”没有运行。假设这是正确的,我们检查pgrep是否在进程列表中找不到myscript.sh,如果是,我们再次运行flock命令。看起来您可以使用另一种形式的
flock
,flock
,其中
是一个文件描述符。如果您将其放入子shell,并将该文件描述符重定向到锁定文件,则flock将等待,直到它可以写入该文件(或者,如果它无法立即打开并且您已传递了-n
,则会出错)。然后,您可以在子shell中执行所有操作,包括测试您运行的脚本的返回值:
(
if flock -n 200
then
myscript.sh
echo $?
fi
) 200>lockfile
也许这样的事情对你有用
#!/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
或者,如果OP以后需要使用
$?
,那么就去掉子shell并显式地打开/关闭,比如exec 200>lockfile;如果。。。fi;exec 200>&-
。