当前位置:  开发笔记 > 编程语言 > 正文

确保只有一个Perl程序实例正在运行的最佳方法是什么?

如何解决《确保只有一个Perl程序实例正在运行的最佳方法是什么?》经验,为你挑选了2个好方法。

有几种方法可以做到这一点,但我不确定哪一种是最好的.

这是我能想到的:

使用pgrep查找进程.

让脚本使用flock锁定自己,然后在每次运行时检查它是否被锁定.

在/var/run/program_name.pid中创建一个pid文件并检查是否存在,并在需要时比较pid.

可能有更多方法可以做到这一点.您认为最好的方法是什么?



1> Leon Timmerm..:

有很多方法可以做到这一点.PID文件是传统的方法.您也可以对文件进行锁定,例如程序本身.这段小代码可以解决这个问题:

use Fcntl ':flock';
open my $self, '<', $0 or die "Couldn't open self: $!";
flock $self, LOCK_EX | LOCK_NB or die "This script is already running";

与PID文件相比的一个优点是文件在程序退出时自动解锁.以可靠的方式实施起来要容易得多.


@MikeKulls:对不起,但这是关于风格/个人偏好的问题.IMO优先级不是你想"避免试图知道"的东西,如果你真的想要尝试lisp.对我来说,添加多余的括号只会增加心理解析的效果.

2> Rob Wells..:

做旧的PID文件技巧.

开始过程

看看是否有一个名为"myprog.PID"的文件

检查是否存在正在运行的proc.使用kill 0,$ pid匹配PID

如果编程PID proc的名称.比赛,大声抱怨并退出

如果没有,清理陈旧的"myprog.PID"

创建一个名为"myprog.PID"的文件,然后继续

HTH

干杯,


这可以通过从文件中读取PID并检查进程是否仍然存在(使用kill 0,$ pid)来改进.如果没有,则忽略旧的pid文件并继续.这有助于从崩溃的进程中更优雅地恢复.
请注意,如果两个进程同时尝试启动,同时检查文件,并且都没有提交pid文件,则这也会出现争用情况.
推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有