Linux Cron作业在同一时间在可用的VMs中运行多次

Linux Cron作业在同一时间在可用的VMs中运行多次,linux,perl,cron,Linux,Perl,Cron,我必须在cron中运行一个脚本,我将cron条目保存在/etc/cron.d目录中 下面是我的cron条目的样子(在/etc/cron.d/cron\u for\u abd\u list.cron): 因此,我的cron脚本将每小时30分钟运行一次,并将日志存储在LOG目录中,即/home/usr/vinod/ABD_List/LOG/ 实际上,系统的配置方式是,此cron一次将在2台服务器中运行。因为这就是环境的配置方式 我有名为serv-1-sms和serv-2-sms的主机,当我将此cro

我必须在cron中运行一个脚本,我将cron条目保存在/etc/cron.d目录中

下面是我的cron条目的样子(在
/etc/cron.d/cron\u for\u abd\u list.cron
):

因此,我的cron脚本将每小时30分钟运行一次,并将日志存储在
LOG
目录中,即
/home/usr/vinod/ABD_List/LOG/

实际上,系统的配置方式是,此cron一次将在2台服务器中运行。因为这就是环境的配置方式

我有名为
serv-1-sms
serv-2-sms
的主机,当我将此cron条目保留在/etc/cron.d/目录中时,它将同时在两个主机中触发

所以,为了避免它在同一时间运行多次,我在脚本中使用了下面的逻辑

逻辑是,当脚本开始运行时(从
serv-1-sms
serv-2-sms
),它将首先检查同一目录中的伪文件
tempfile.txt
)。如果它已经存在,则进程将终止,否则脚本将继续运行,并在结束时删除开头创建的
tempfile.txt

use strict;
use warnings;

my $filename = "/home/usr/vinod/ABD_List/tempfile.txt";
if (-e $filename) {
    print "File already exists.. Exiting: $$\n";
    exit 0;
}

system("touch $filename");

...
#executing the rest of the things in the scripts
...

unlink $filename;

print "END\n";
这就是我如何避免在同一时间运行同一脚本的冲突


我觉得这个逻辑有点奇怪。如果有其他可用的逻辑,请建议我,或者我们是否可以在crontab中控制此冲突,这将更有帮助。

两台服务器上的cron作业是否同时启动?@benjessop Nope。我使用这种逻辑是为了避免在两台服务器上同时运行它。但是这段代码允许一个可能有数据丢失或未定义行为等的竞争条件。相反,您可以使用和打开一个文件(在Perl中,而不是通过
system
!),如果它已经被锁定,则退出。一定要仔细阅读这篇文章。这是我要说的。如果系统上的锁定功能有问题,这里有一个例子。两台服务器上的cron作业是否同时启动?@benjessop Nope。我使用这种逻辑是为了避免在两台服务器上同时运行它。但是这段代码允许一个可能有数据丢失或未定义行为等的竞争条件。相反,您可以使用和打开一个文件(在Perl中,而不是通过
system
!),如果它已经被锁定,则退出。一定要仔细阅读这篇文章。这是我要说的。如果您的系统上的锁定设备有问题,这里有一个例子。
use strict;
use warnings;

my $filename = "/home/usr/vinod/ABD_List/tempfile.txt";
if (-e $filename) {
    print "File already exists.. Exiting: $$\n";
    exit 0;
}

system("touch $filename");

...
#executing the rest of the things in the scripts
...

unlink $filename;

print "END\n";