我们的系统使用的常用函数脚本使用简单的STDERR重定向来创建特定于用户的错误日志。它就像这样
# re-route standard out to text file
close STDERR;
open STDERR, '>>', 'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt'
or die "couldn't redirect STDERR: $!";
现在,我将它复制粘贴到我自己的函数脚本中,以获取系统特定的错误日志,并且在编译时,它会破坏需要它的脚本。奇怪的是,它甚至不会打印子脚本抛出的错误。我的略微修改版本看起来像,
close STDERR;
open (STDERR, '>>', 'err/STDERR_SPORK.txt')
or die print "couldn't redirect STDERR: $!";
在命令提示符下编译好的一切,-c
返回ok,如果我向函数脚本发出警告并编译,它输出正确。我仍然不明白为什么这会杀死孩子们。我删除了重定向,确定它们有效。有什么想法吗?
答案 0 :(得分:4)
die
(和warn
)写入STDERR
。如果您在尝试重新打开时关闭STDERR
然后需要die
,那么您希望在哪里看到错误消息?
由于这是Perl,因此有很多方法可以解决此问题。这是一对夫妇。
首先将文件打开到tmp文件句柄,如果一切正常,则将其重新分配给STDERR
if (open my $tmp_fh, '>>',
'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt') {
close STDERR;
*STDERR = *$tmp_fh;
} else {
die "couldn't redirect STDERR: $!";
}
使用con
。对于从命令行运行的程序,大多数系统都有"当前终端"的概念。在Unix系统中,它是/dev/tty
,在Windows上,它是con
。打开此终端伪文件的输出流。
open STDERR, '>>',
'd:/output/Logs/STDERR_' . &parseUsername($ENV{REMOTE_USER}) . '.txt'
or do {
open my $tty_fh, '>', 'con';
print $tty_fh "couldn't redirect STDERR: $!";
exit 1;
};
答案 1 :(得分:0)
在脚本中没有更改任何内容,并在服务器中进行调整,并且不进行任何更改之后,它现在可以按预期工作。说实话,我不知道该说些什么。