Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何检查flock执行的命令的退出代码?_Bash_Cron_Exit Code_File Locking_Flock - Fatal编程技术网

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

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的退出代码,我该怎么办?它返回的任何

大家好。我正在设置一个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
覆盖,因此我无法知道它是否成功执行

#!/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>&-