我怎样才能一次只从 cron 运行一次脚本?

我怎样才能一次只从 cron 运行一次脚本?

我想运行一个 cron 作业。安排它很容易,而且有效。

我的问题是我不知道如何一次只运行一个版本。

有任何想法吗?

G-Man

答案1

我向 embobo 表示歉意,但我复制了他的脚本并对其进行了修改,以消除我在对他的回答的评论中指出的竞争条件:

#!/bin/sh
LOCKDIR=/var/run/myprog.lock
mkdir --mode=700 $LOCKDIR || exit 0
trap "{ rm -rf $LOCKDIR ; exit 0; }" EXIT
# do stuff

基本上,我们依靠目录创建是原子的这一事实,因此只有一个同时运行的此脚本副本可以成功创建$LOCKDIR。最好确保它$LOCKDIR在本地驱动器上,而不是在 NFS 磁盘或 Samba 挂载上等。

答案2

您可以使用锁定文件。示例 shell 代码:

#!/bin/sh
LOCKFILE=/var/run/myprog.pid
[ -f $LOCKFILE ] && exit 0
trap "{ rm -f $LOCKFILE ; exit 0; }" EXIT
echo "$$" > $LOCKFILE
# do stuff

确保在任何类型的退出(正常或异常)时删除锁定文件非常重要。这就是命令的作用trap

如果锁定文件存在,您可以通过执行更多操作使其更加复杂。例如,从文件中获取 pid 并查看它是否实际正在运行。

答案3

只需让脚本在启动时接触某个文件,并在完成时删除该文件即可。然后,在脚本中,您可以在执行任何操作之前检查该文件是否存在。

伪代码如下:

if (!exists(/var/run/filename))
{
    touch /var/run/filename;
    do stuff;
    rm /var/run/filename;
}

答案4

大多数系统上都安装了“lockfile”二进制文件,您可以使用它来避免陷入 bash 脚本的争斗游戏。在 RHEL/CentOS/Fedora 上,它是 procmail 包的一部分。

因此你可以输入类似以下内容的内容:
lockfile /var/lock/mycron.lock && /usr/local/bin/mycron && rm -f /var/lock/mycron.lock

手册页中有更多选项,您可以将其设置为等待一段时间、自行清理等。

相关内容