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

我想运行一个cron工作。 调度它很容易,工作。

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

有任何想法吗?

G-人

我对embobo道歉,但我复制了他的脚本,并修改它,以消除我在他的回答中注意到的竞争条件:

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

基本上,我们指望目录创build是primefaces的,所以只能同时运行这个脚本的一个副本可以成功创build$LOCKDIR 。 最好确保$LOCKDIR位于本地驱动器上,而不是NFS磁盘或Samba安装盘等上

你可以使用locking文件。 示例shell代码:

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

确保locking文件在任何types的退出(正常或exception)被删除是非常重要的。 这是trap命令的作用。

如果存在locking文件,则可以通过做更多的事情来使其更复杂。 例如,从文件中获取pid,看看它是否真的在运行。

只需让脚本在启动时触摸文件,并在完成时删除该文件。 然后在脚本中,可以在做任何事之前检查该文件的存在。

在伪代码中:

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

你可以在上面创build一个锁文件或目录。 我个人打开一个套接字连接到一些高端口。 这确保即使应用程序崩溃,套接字也将被closures。 使用locking文件时,文件可以继续运行,并且只有手动删除脚本才能运行。

根据我的经验,这被certificate是更可靠的。

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

所以你可以把这样的东西:
lockfile /var/lock/mycron.lock && /usr/local/bin/mycron && rm -f /var/lock/mycron.lock

在手册页中有更多的选项,你可以设置它等待一段时间,自己清理等等。

我似乎成功跟随着调用脚本:

 #!/bin/zsh RED_="\033[31m" BLUE_="\033[34m" BLACK_="\033[0m" if [ $# -lt 1 ]; then echo "$0: Invoke a program/script only once at a time" echo "Syntax: $0 <program/script with parameters>" else if ps -Alf | grep "$*" | grep -v grep | grep -v $0 >/dev/null; then echo "$BLUE_\"$@\"$RED_ runs already. I don't invoke it.$BLACK_" else echo "${RED_}I invoke: $BLUE_$@$BLACK_" $@ fi fi