Perl中使用File::Lockfile确保脚本单实例运行_perl

用Perl写了一些监控脚本,放在crontab中调度执行。有时候会发现一个脚本运行时间过长,会同时跑起多个实例,因此有必要为脚本加上控制,只运行一个实例。

最简单自然的想法,在脚本中检查并创建一个空的lock文件,脚本结束时再删除。通过判断文件是否存在的方式来判断脚本是否已经运行。不过这样做有个bug,如果脚本运行过程中异常终止,lock文件没有正常删除,就会导致脚本无法再运行。

空的lock文件不行,那么考虑在lock文件中加入一点内容,比如进程的PID号,然后通过检查该PID号的进程是否还在运行,就能避免上述bug了。在CPAN上有很多现成的模块能够完成上述功能,如File::Lockfile, File::Pid, Proc::PID::File 等。

下面是File::Lockfile的一个示例,非常简单:

以下是代码片段:

复制代码 代码如下:

#!/usr/bin/perl -w
useFile::Lockfile;
# lock文件位于/tmp目录,名为test_file_lock.lck
my $lockfile= File::Lockfile->new('test_file_lock','/tmp');
# 检查脚本是否已经运行,如已运行则退出
if ( my $pid= $lockfile->check ) {
  print"program is already running with PID: $pid";
  exit;
}
#更新lock文件
$lockfile->write;
# 脚本逻辑
sleep30
#删除lock文件
$lockfile->remove;

通过查看File/Lockfile.pm的源代码可以看到,判断lock文件中记录的进程是否已经运行,简单的通过 kill -0 $pid 即可实现。所以即使不用上述模块,自己实现也是非常容易的。

小结:

该方法是在脚本中经常用到限制单实例的方法,MySQL 等程序在每次启动前也会检查上次遗留的 mysql.pid 文件。

另一个方法:给lock文件加排它锁,判断是否有锁来确保唯一性。

时间: 2024-10-01 00:38:10

Perl中使用File::Lockfile确保脚本单实例运行_perl的相关文章

C#实现单实例运行

C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 Mutex 的方式是较好的选择. [STAThread] static void Main() { bool isAppRunning = false; System.Threading.Mutex mutex = new System.Threading.Mutex( true, System.D

使用Mutex实现程序单实例运行(c#)

转自 http://blog.csdn.net/jackyxu_2008/archive/2009/04/26/4126820.aspx 大家在开发程序的时候,有时需要限制程序,只能同时运行一个实例,实现此功能,对于VB.NET是非常容易的,只要指定一个属性即可,但是C#实现起来,就稍微繁琐了. C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 M

WinCE下应用程序的单实例运行

      实现应用程序的单实例运行有很多种方式.如果是有窗口的应用程序,可以通过FindWindow()查找窗口来确认是否已有同名窗口存在.如果是无窗口的应用程序,可以用互斥体等内核对象实现.一般来说,在程序的入口处检查是否已有实例在运行.如果没有,则继续执行.如果有,则退出本次运行.基本流程如下图所示.             以互斥体实现的单实例参考代码如下. int _tmain(int argc, _TCHAR* argv[]){    HANDLE hMutex = CreateMu

perl中的字符串操作函数chomp与chop介绍_perl

chomp与chop都是用于去除字符串变量尾部的字符,但它们有各自的区别. chomp函数对变量起作用,而此变量含有字符串.如果字符串结尾有换行符,chomp可以去掉它.这基本上就是它能完成的所有功能,如下例: 复制代码 代码如下: $text="alineoftext\n      "; #也可以由<STDIN>输入 chomp($text);    #去掉换行符(\n). 它非常有用,基本上你的每一个程序都会用到它.如你将知道,这是将字符串末尾换行符去掉的最好方法.基于

利用共享数据段实现限制EXE单实例运行

确保你的程序只有一个进程实例在运行有很多种方法,利用共享数据段的方法最简单方便. 一个EXE文件是有不同的段(Section)组成的,其中有若干代码段和若干数据段.在默认情况 下,操作系统为了确保每个进程实例在安全环境中运行会为每个进程实例创建自己的数据段的 拷贝,这样多个进程实例就不会因为一个实例修改了数据段的内容而影响到另外的进程实例. 但是我们也可以为EXE创建共享数据段,这样多个进程实例就可以共享这个数据段而不会拥有自 己的拷贝. 因此我们可以在共享数据段里存放一个变量来表示目前进程实例

利用C#线程机制实现应用程序的单实例运行

程序 只要你的程序中Main入口是如下的,则你的程序在运行时,在一个时刻只能有一个程序实例,比如Winamp就是这种,当它在运行时,再又击这个程序,是不会再运行一个实例的. 代码很简单 [STAThread]          static void Main(string[] args)          {               bool isExist;  System.Threading.Mutex mutex=new System.Threading.Mutex(true,"my

Perl中捕获警告信息、异常信息并写入日志详解

  这篇文章主要介绍了Perl中捕获警告信息.异常信息并写入日志详解,本文分别给出了捕获警告--不处理.捕获警告--并转换成异常.捕获警告--并写入日志.捕获并写日志的完整例子等实用实例,需要的朋友可以参考下 虽然建议在每个Perl脚本和模块中开启警告,可是你又不想用户看到Perl发出的警告. 一方面你想在代码前面使用use warnings作为你的安全网,另一方面,通常警告会出现在屏幕上.多数情况下,客户不知道如何处理这些警告.如果幸运的话这些警告仅仅让客户惊讶一下,当然,不幸的是他们尝试着去

html 中 #include file 的用法示例介绍

 html 中 #include file 的用法示例介绍 有两个文件a.htm和b.htm,在同一目录下a.htm内容如下 代码如下: <!-- #include file="b.htm" --> b.htm内容如下 今天:雨 31 ℃-26 ℃ <br />明天:雷阵雨 33 ℃-27 ℃ 直接在浏览器中打开a,没有任何显示,后来知道,include是SSI(Server Side Include),在html中不支持include,之后把a.htm改成a.

Perl中的单行注释和多行注释语法

  这篇文章主要介绍了Perl中的单行注释和多行注释语法,本文还同时讲解了其它常见编程语言的单行注释和多行注释语法,需要的朋友可以参考下 同其他大多数编程语言一样,Perl中的单行注释也是#开头,例如: 代码如下: #print "Hello,World!"; 但多行注释,不同的语言有不同的注释方式,比如说: Java,C/C++: 代码如下: /* *注释若干行 *注释若干行 *注释若干行 */ Python: 代码如下: """ 用三个双引号,多行注释