0

我使用下面的代码来检查 replace.exe 的单个实例是否正在运行。当我创建 replace.exe 并在 Windows 上运行时,又创建了一个名为 replace(没有任何扩展名)的 0 kb 大小的文件。

我不希望创建该文件,否则我想在 replace.exe 执行结束后自动删除该文件。

请帮助我。谢谢

use Fcntl qw(:flock);
# Check if any instance of this script is already running
my $lock = "replace";
sub LockOut ( ) {
  &print_log ("A instance of this script is running. Therefore exiting. Please try after some time.");
  print "A instance of this script is running. Therefore exiting. Please try after some time.";
  exit 1;
}

open ( my $pid, '>', $lock );
flock ( $pid, LOCK_EX | LOCK_NB ) or LockOut( );
4

1 回答 1

0

我假设您正在使用以某种方式编译成 Windows 可执行文件的 perl 脚本,并且您希望它在单个实例中运行。

您可以尝试以下方法:

use Fcntl qw(LOCK_EX LOCK_NB LOCK_UN);
if (!flock DATA,LOCK_EX|LOCK_NB)
{
    print STDERR "Already running! Exiting...\n";
    exit;
}

#### DO NOT REMOVE ####
__DATA__
This DATA-Block will be locked by the single-instance logic,
preventing it to be locked more than once.

在 perlscript 中,可以独占锁定 __DATA__ 块,但我不知道您的脚本编译器是否保留了该功能。

如果这不起作用,您可以找出可执行文件的文件名并锁定那个文件,它应该与锁定一个名为“replace”的文件做同样的事情。

于 2013-03-21T12:40:07.513 回答