我在互联网上搜索了不同的解决方案,而我最接近的是open
语句中的练习:
use strict;
use warnings;
use Carp;
# Save previous state
my ($old_out, $old_err);
open($old_out, ">&", \*STDOUT) or
croak("Cannot save STDOUT: $!\n");
open($old_err, ">&", \*STDERR) or
croak("Cannot save STDERR: $!\n");
my ($fh_OUTLOG);
# Make a filehandle for the tee output
open($fh_OUTLOG, "|-", "tee out_err.log") or
croak("Cannot open filehandle to tee to log file: $!\n");
# Duplicate STDOUT and STDERR to the filehandle
open(STDOUT, ">&", $fh_OUTLOG) or
croak("Cannot duplicate STDOUT to filehandle: $!\n");
open(STDERR, ">&", $fh_OUTLOG) or
croak("Cannot duplicate STDERR to filehandle: $!\n");
# Code...
# Restore STDOUT
open(STDOUT, ">&", $old_out) or
croak("Cannot restore STDOUT: $!\n");
# Close the filehandle
close $fh_OUTLOG
or croak( ($!) ? "Error closing fh_OUTLOG: $!"
: "Exit status $? from tee log.out");
# Restore STDERR
open(STDERR, ">&", $old_err) or
croak("Cannot restore STDERR: $!\n");
但是这段代码不会产生STDERR的日志文件,我也不知道如何添加它。解决方案的标准是:
我在考虑为STDERR使用一些tee
解决方案:
open(STDERR, "| tee log.err");
open(STDERR, ">&", $fh_OUTLOG);
但是使用它会在执行结束时挂起脚本。 (想想开球儿童过程仍然活着)。但是如果我最终试图杀死它,脚本仍会挂起。
my $pid_std_err = open(STDERR, "| tee log.err") or
croak("Cannot tee filehandle STDERR to log.err: $!\n");
# Code...
kill -9, $pid_std_err;
答案 0 :(得分:0)