`
maxer025
  • 浏览: 79627 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

如何 让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
use File::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;
# 脚本逻辑
sleep 30
#删除lock文件
$lockfile->remove;
通过查看File/Lockfile.pm的源代码可以看到,判断lock文件中记录的进程能不能已经运行,基本的通过kill 0,$pid即可实现。所以即使不用上述模块,自己实现也是非常容易的。
分享到:
评论

相关推荐

    VB运行perl脚本工具

    这是一个运行Perl脚本的基础,因为它可以解析和执行Perl代码。 2. 引入Perl COM对象:VB可以利用Perl的COM(Component Object Model)支持来创建一个Perl解释器对象,通过这个对象,VB可以直接调用Perl脚本。在VB中...

    在Java中运行Perl脚本 JERL

    因此,对于需要多次执行Perl脚本的情况,建议使用单例模式维护一个全局的Perl解释器实例。 总的来说,JERL为Java开发者提供了一种集成Perl脚本的强大方式,使得Java应用能够利用Perl的灵活性和文本处理能力,同时...

    C调用perl脚本程序

    接下来,我们将展示一个示例C程序,该程序可以用来调用一个Perl脚本并传递参数给它。 ```c #include #include <perl.h> int main() { // 定义Perl解释器指针 static PerlInterpreter *my_perl; // 为解释器...

    perl常见编程100个实例

    数组索引从0开始,`$array[0]`获取第一个元素。 3. **文件I/O**:Perl提供了打开、关闭、读取和写入文件的简便方法。`open`函数用于打开文件,`<FILEHANDLE>`用于读取,`>FILEHANDLE`用于写入。`close`函数用于关闭...

    perl脚本调用练习和调用系统命令并展示输出信息

    2. `test.pl`: 这是一个Perl脚本,很可能是用来演示如何调用系统命令和处理输出的实例。 在实际应用中,Perl脚本可能与Java或其他编程语言结合使用,例如,Java程序可以启动和控制Perl脚本,而Perl脚本则处理特定的...

    基于Java的实例源码-在Java中运行Perl脚本 JERL.zip

    总的来说,"基于Java的实例源码-在Java中运行Perl脚本 JERL.zip"是一个关于如何在Java环境中执行Perl脚本的实践教程。通过学习和使用这个库,开发者能够扩展Java应用程序的功能,利用Perl的强大力量,特别是对于那些...

    PERL脚本实例代码

    perl编程实例,与书配套的实例代码 $name="Suzanne"; # These variables are in package main $num=100; package friend; # Package declaration sub welcome { print "Who is your pal? "; chomp($name=); ...

    perl脚本学习范例

    "perl脚本学习范例"这个主题提供了深入理解Perl编程语言的机会,通过具体的实例来探索其语法和特性。 首先,Perl的语法基础是必须掌握的。Perl支持多种数据类型,包括标量(数字或字符串)、数组(一系列有序元素)...

    在Java中运行Perl脚本 JERL.7z

    在Java环境中运行Perl脚本可能对开发者来说是一个挑战,因为Java和Perl是两种不同的编程语言,它们有自己的执行环境。然而,有一些工具和库可以帮助我们实现这个目标。JERL(Java-Embedded Ruby and Perl Library)...

    基于Java的在Java中运行Perl脚本 JERL.zip

    "基于Java的在Java中运行Perl脚本 JERL.zip" 提供了一个解决方案,它是一个名为JERL(Java-Embedded Ruby and Perl Library)的库,允许Java应用程序直接执行Perl脚本。 JERL是Java和Perl之间的桥梁,使得Java...

    高级perl编程脚本实例 TXT版

    "高级Perl编程脚本实例 TXT版"是一本深入探讨Perl高级特性和技术的书籍,它旨在帮助经验丰富的Perl程序员提升技能,理解并掌握更复杂的编程概念。这本书的PDF电子版可能包含了关于以下主题的详细讨论: 1. **Tie**...

    java源码:在Java中运行Perl脚本 JERL.zip

    "java源码:在Java中运行Perl脚本 JERL.zip" 提供了一个解决方案,它允许Java应用程序直接执行Perl脚本,这在处理特定文本操作或利用Perl的某些高级功能时非常有用。 JERL,全称Java-Embedded Ruby and Perl ...

    Perl实例精解(第四版).part2

    Perl 脚本在功能上类似于UNIX awk、sed、shell 脚本和C 程序。shell 脚本主要由UNIX 命令构成,Perl 脚本则不然。sed 和awk 用于编辑和报告文件,但是Perl 无需执行文件即可工作。C 没有shell、sed 和awk 的任何模式...

    基于java的在Java中运行Perl脚本 JERL.zip

    在这种情况下,JERL(Java-Embedded Ruby and Perl Library)提供了一个解决方案,它允许Java应用程序直接执行Perl脚本,而无需依赖外部进程。 JERL是一个开源库,旨在为Java开发者提供一个方便的接口,以便在Java...

    perl脚本语言权威教程合集(两本中文版)及ActivePerl_安装包_version_5.6.1.635

    "perl脚本语言权威教程合集(两本中文版)"提供了全面的学习资源,帮助初学者和进阶者掌握Perl的核心概念和高级技巧。 首先,"Perl编程24学时教程"可能是一本按照时间线设计的教程,涵盖了Perl的基础语法,如变量、...

    Perl实例精解书中源码

    同时,调试过程也是学习的一部分,了解代码在不同操作系统下的运行情况有助于培养跨平台开发的经验。 总的来说,"Perl实例精解"的源码集合是一份宝贵的教育资源,它为读者提供了动手实践的机会,帮助他们在理论与...

    perl脚本实例,处理文本,文件,可供学习参考

    在这个"perl脚本实例,处理文本,文件,可供学习参考"的压缩包中,包含了五个Perl脚本,它们分别是getvirus2.pl、getVirus.pl、gapcount.pl、fa_name_leng.pl和batch_in_out_direct.pl。这些脚本旨在帮助初学者理解...

    基于java的开发源码-在Java中运行Perl脚本 JERL.zip

    当Java程序使用JERL时,会创建一个Perl虚拟机实例,并通过JNI接口执行Perl脚本,将结果返回给Java环境。 **使用JERL的步骤** 1. **添加依赖**:首先,你需要将JERL的库文件(jar和相应的本地库,如dll或so文件)...

    Perl脚本实例

    总的来说,Perl脚本实例提供了一个实践和学习Perl语言的宝贵资源。通过深入研究和实践,你可以掌握这个强大的工具,提升你的编程技能,无论是在日常任务自动化还是复杂的系统集成中都能游刃有余。

    核心交联脚本_grownlme_Perl_materialsstudio_crosslink_核心交联脚本_源码.rar.rar

    核心交联脚本是用于处理材料科学数据的一种高级工具,主要涉及Perl编程语言和Materials Studio...同时,对于Perl程序员和Materials Studio的高级用户,源码可以作为一个学习和参考的实例,以便进一步定制和扩展其功能。

Global site tag (gtag.js) - Google Analytics