Sma*_*elf 1 mysql unix linux perl locking
我试图确保只有一个perl脚本的实例可以同时运行.该脚本根据传入的参数执行某种db_operation.脚本不一定存在于一个地方或一台机器上,也可能存在多个操作系统.虽然文件系统是在各种机器上自动安装的.
我的第一个方法是创建一个.lock文件,并执行以下操作:
use warnings;
use strict;
use Fcntl qw(:DEFAULT :flock);
...
open(FILE,">>",$lockFilePath);
flock(FILE,LOCK_EX) or die("Could not lock ");
do_something();
flock(FILE,LOCK_UN) or die("Could not unlock ");
close(FILE);
Run Code Online (Sandbox Code Playgroud)
但我不断收到以下错误:
Bareword "LOCK_EX" not allowed while "strict subs" in use
Bareword "LOCK_UN" not allowed while "strict subs" in use
Run Code Online (Sandbox Code Playgroud)
所以我正在寻找另一种解决问题的方法.锁定数据库本身也不实用,因为db可以被其他脚本使用(这是可以接受的),我只是试图阻止这个脚本运行.锁定表进行写入是不切实际的,因为我的脚本不知道操作正在发生什么表,它只是启动另一个作为参数提供的perl脚本.
我想在数据库中添加一个表,只有一个值,并将其用作muetex,但我不知道它是多么实用/可靠(我脑子里有很多红旗).我有一个DBI连接到这个脚本使用的数据库.
谢谢
Bareword你得到的错误听起来就像你在"......"中做了一些事情来混淆Perl关于导入的Fcntl常量.使用这样的常量没有错.您可以尝试一些类似于LOCK_UN()查看错误的内容.
如果您使用的是MySQL,则可以使用GET_LOCK()和RELEASE_LOCK()机制.它适用于这样的情况:
SELECT GET_LOCK("script_lock");
Run Code Online (Sandbox Code Playgroud)
然后当你完成:
SELECT RELEASE_LOCK("script_lock");
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅http://dev.mysql.com/doc/refman/4.1/en/miscellaneous-functions.html.