Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Perl脚本将多个源的日志消息写入文本文件时,代码挂起_Perl_Command Line Interface_Perlscript - Fatal编程技术网

使用Perl脚本将多个源的日志消息写入文本文件时,代码挂起

使用Perl脚本将多个源的日志消息写入文本文件时,代码挂起,perl,command-line-interface,perlscript,Perl,Command Line Interface,Perlscript,我正在使用下面的代码将日志消息写入文本文件,当不同的源并行调用此方法时,程序被挂起。是否有一种在不中断程序的情况下授予/控制并行写入的方法 sub sLog { my $self = 'currentServerDirectory'; my $logMsg = ""; my $fileName = join '_', $self->{LogFilePrefix}, &sTimeStamp("Log"); my $absFileName = "$se

我正在使用下面的代码将日志消息写入文本文件,当不同的源并行调用此方法时,程序被挂起。是否有一种在不中断程序的情况下授予/控制并行写入的方法

sub sLog {
    my $self = 'currentServerDirectory';
    my $logMsg = "";

    my $fileName = join '_', $self->{LogFilePrefix}, &sTimeStamp("Log");
    my $absFileName = "$self->{LogFolder}/$fileName.txt";

        open APPHDLER, ">>$absFileName" or &exitErr("Cannot append message to file, $absFileName");
        print APPHDLER scalar(localtime(time))." - $logMsg\n";
        close APPHDLER;
}

当您打开一个文件进行写入时,该文件上的锁将授予打开该文件的进程。这样做是为了防止进程相互覆盖而损坏数据。可能的解决方案是将输出数据提供给一个处理写入日志文件的进程,确保进程在完成写入后关闭文件并释放锁,或者使用为并行访问文件而设计的库或文件格式。对于编写这样的日志文件,前两种方法是最简单和首选的。可能还有处理日志文件的perl模块(检查CPAN)。

尝试使用
flock
——下面是一个简单的示例,您可以尝试了解其行为:

use strict;
use warnings;
use Fcntl qw/:flock/;

chomp(my $id = `date`);
my $cnt = 0;
while (1) {
    open LOG, ">>shared" or die "Couldn't open shared";
    flock (LOG, LOCK_EX) or die "Couldn't flock";
    print LOG "$id: $cnt\n";
    $cnt++;
    sleep 1;
    close LOG;
}
假设它保存在flock.pl中,那么您可以运行
flock.pl&
在后台运行一个或多个实例。然后执行
tail-f shared
查看发生了什么。由于在获取锁和通过
close LOG
释放锁之间睡眠1秒,因此如果有一个进程,您将每秒看到一次更新。但是,如果您有N个进程,您将看到每个进程都需要N秒


在现有示例中,您可以尝试添加
use Fcntl
flock
行。

这是不正确的。文件句柄在Perl中没有隐式锁定,常规的
open
调用不能防止并行进程破坏输出流?我认为这不在perl的控制之下,而是文件系统或操作系统。
open
如果您在Windows平台上,可能会触发强制锁。但在Unix上不会。您在哪个平台上运行?如果是Unix,它不应该锁定任何东西。尽管写的内容冲突仍然会导致问题。另外,您使用的并行模式是什么<代码>叉或
螺纹
?因为这告诉了我们如何仲裁争议的答案。