我想运行一个 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
手册页中有更多选项,您可以将其设置为等待一段时间、自行清理等。