【问题标题】:Perl: Finding out what files were created/modified by another script called within current scriptPerl:找出当前脚本中调用的另一个脚本创建/修改了哪些文件
【发布时间】:2011-11-05 01:55:20
【问题描述】:

我正在尝试创建一个顶级脚本,该脚本将调用大约 35 多个其他脚本,每个脚本都将寻求修改/创建文本文件。不是最好的做事方法,也不是最有趣的,但需要。

我使用“系统”命令调用这些脚本中的每一个,但我想知道找出每个被调用的脚本创建/修改了哪些文件的方法。

最非侵入性的方法是在运行子脚本之前和之后简单地记下工作目录中所有文件的时间戳,但我担心这可能不够健壮。

所以我想知道 Perl 中是否有一个模块/方法可以快速放入所有子脚本中,这些子脚本将捕获所有文件操作并将其作为某种返回值传递给调用脚本?

非常感谢所有帮助,非常欢迎其他想法!

干杯

【问题讨论】:

  • 您可以使用 strace 运行脚本并查找 fopen 等。但是,这可能不是特别容易或健壮。
  • 您可以让脚本在创建或修改文件时打印一些内容(例如Created file: $name_of_fileModified file: $name_of_file),然后在您的顶级脚本中打开每个脚本的输出管道并监听正确的输出。
  • 这对PerlMonks 来说可能是个好问题,因为您似乎有兴趣深入了解 Perl 的内容

标签: perl


【解决方案1】:

就像a'r 建议的那样,我很想使用strace。将调用 system() 替换为调用此包装器:

use File::Temp qw/tempfile/;

# ...

sub sys { # a wrapper for system()
  my ($fh, $filename) = tempfile();
  my $st = system("strace", "-o", $filename, "-eopen", @_);

  # report files used by the script -- customize as needed
  print STDERR "files accessed by $_[0]:\n";
  while (<$fh>) { print STDERR; }

  return $st;
}

然后你只修改父脚本而不是所有子脚本。

strace-eopen 参数仅过滤掉 open 调用。这还将捕获对 fopen 的调用(这是一个 C 库例程,而不是系统调用。)

【讨论】:

  • 谢谢!我现在正在解析 strace 输出以获得我需要的东西。
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
相关资源
最近更新 更多