【问题标题】:Perl File::Tail with a symbolic linkPerl File::Tail 带有符号链接
【发布时间】:2015-11-12 14:32:59
【问题描述】:

背景

我正在使用File::Tail 跟踪日志文件符号链接。符号链接在午夜后更新以包含一个新的日期戳,不幸的是我的脚本在符号链接更新后没有尾随新文件。否则,我的脚本会按预期工作。

#!/usr/bin/env perl

use strict;
use warnings;
use utf8;
use Data::Dumper;
use charnames':full';
use Cwd 'abs_path';
use File::Tail;

my $symlink = sub {
my($log) = '/home/user/log'; 
};

my $file=File::Tail->new(
        name=>&$symlink,
        ignore_nonexistant=>1,
        tail=>0,
        interval=>0,
        maxinterval=>1,
        name_changes=>\&$symlink
        ) || warn $!;
print Dumper $file;

while (defined($_=$file->read)) {
# do a bunch of stuff;
}

问题

如何让 perl 跟随更新的符号链接?

【问题讨论】:

  • 看文档,不知道你有没有玩过resetafter属性?
  • resetafter => 10 秒。

标签: perl tail


【解决方案1】:

来自 File::Tail documentation:

name_changes

一些日志系统会更改它们正在写入的文件的名称,有时会包含日期,有时会包含序列号, 有时还有其他更奇怪的变化。

File::Tail 不会尝试实现各种巧妙的检测方法,而是会调用 name_changes 中定义的代码引用。这 代码引用应返回作为新名称的字符串 文件尝试打开。

注意如果文件不存在,File::Tail 会报致命错误(除非也指定了ignore_nonexistant)。

因此,您的代码参考应该返回 new 文件的名称,根据您的问题,该文件中有一个日期字符串。也许这样的事情会起作用:

use Path::Tiny;  # file system agnostic path utilty
use Time::Piece; # data utilties

my $symlink = sub {
   my $time = localtime; # a Time::Piece object
   return path(
      '/home/user/log',
      join('', $time->year, $time->mon, $time->mday), 
   )->canonpath;
};

今天这个子将返回:/home/user/log20151112

【讨论】:

  • 我尝试解析绝对路径并直接拖尾文件,而不是使用符号链接。 my($log) = abs_path('/home/user/log');这似乎也不起作用。
  • 这与使用 Cwd 解析符号链接有什么不同吗?
【解决方案2】:

我错过了潜艇的回报

my $symlink = sub {
my($log) = '/home/user/log'; 
return $log;
};

现在完美运行!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2014-01-25
    • 2021-11-07
    • 2017-03-24
    • 2022-01-04
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多