使用cronjob运行shell脚本一次

时间:2016-06-23 21:23:27

标签: linux bash shell

我有一个调用脚本的cron作业,该脚本每小时检查一次更新。如果有更新,则会调用update.sh,然后调用commands.sh。我希望每个"新" commands.sh只能运行一次。

每当我使用该文件的一些唯一ID运行commands.sh时,我一直在考虑写入文件。在运行commands.sh之前,我会检查文件是否包含commands.sh的ID。如果是这样,请不要运行它。

编辑 - 更多细节:

的cronjob:

  • 从git repo中获取,如果有任何更改则拉取并合并
  • 运行update.sh

    #!/bin/sh
    ./commands.sh
    

我希望./commands.sh只运行一次,因为下一个小时,cron会再次运行,从git中拉出来,然后再次运行update.sh。每个唯一./commands.sh只能运行一次吗?

写完之后,如果git repo发生了变化,最好的方法就是只运行update.sh

这看起来有点矫枉过正,难以维持。有没有更简单的方法来编写只运行一次的bash脚本?

1 个答案:

答案 0 :(得分:1)

commands.sh脚本开头执行此操作:

if [ -f stampfile ]; then
    exit
if
touch stampfile

这将检查名为stampfile的文件(指定可以存储的方便位置的路径)。如果它在那里,只需exit。如果不是,则使用touch创建它。

然后让脚本做它的事情。

略微偏离:这也可以用来避免同时运行两个脚本实例。然后,脚本在运行结束时rm -f stampfile

在这种情况下,如果脚本被终止,stampfile将会过时"陈旧" (邮票存在但脚本不存在)。要检测陈旧stampfile,请将脚本的PID放入其中,而不是触摸它。

检查是否有其他实例正在运行,并管理戳文件:

if [ -f stampfile ]; then
    if kill -0 $(<stampfile) 2>/dev/null; then
        exit
    else
        rm -f stampfile    # stale
    fi
fi
echo $$ >stampfile

# rest of script

rm -f stampfile

用户@CharlesDuffy指出这种管理stampfile的方式可能容易出现PID重用问题,即陈旧stampfile中的PID可能是正在运行的进程中的PID。做任何这些。显然a Linux utility called flock允许您以更强大的方式执行此操作。