【问题标题】:perl script can not be opened with browser and is ok with Linux shell commandperl 脚本无法用浏览器打开,可以用 Linux shell 命令打开
【发布时间】:2017-02-27 03:04:49
【问题描述】:

我有几个 perl 脚本文件,过去几年一直在运行,突然之间,在过去的几天里,它们是 up, down, up, down, ..... 没有语法对他们来说是错误的,因为有时他们会启动,而且他们已经在那里有一段时间了,我最近没有改变他们。另外,我可以毫无问题地从 Lunix shell 命令运行它们,文件权限是 755,所以一切似乎都设置正确。它们由网络托管公司托管,我无权访问服务器日志文件。

错误信息是典型的perl错误信息:

"内部服务器错误 服务器遇到内部错误或配置错误,无法完成您的请求。 请联系服务器管理员并告知他们错误发生的时间,以及您在此错误之前执行的操作。 服务器错误日志中可能会提供有关此错误的更多信息。"

【问题讨论】:

  • 看起来有人更改了服务器配置 (httpd.conf),它在您的测试环境中有效吗?
  • “错误信息是典型的 perl 错误信息”——实际上,它根本不是 Perl 错误信息。该错误是由您的网络服务器生成的。

标签: perl cgi-bin


【解决方案1】:

在程序的早期添加use CGI::Carp qw( fatalsToBrowser ); 以将错误返回给浏览器。

或者,您可以使用 CGI::Carp 使用的相同技术或脚本包装器将错误保存在您自己的日志文件中。

将以下内容添加到脚本的开头,使其将错误和警告记录到您选择的日志文件中。

sub self_wrap {
   my $log_qfn = "$ENV{HOME}/.web.log";  # Adjust as needed.
   open(my $log_fh, '>>', $log_qfn)
      or warn("Can't append to log file \"$qfn\": $!"), return;

   require IPC::Open3;
   require POSIX;

   my $prefix = sprintf("[%s] [client %s] ",
      POSIX::strptime('', localtime),
      $ENV{REMOTE_ADDR} || '???'
   );

   my $suffix = $ENV{HTTP_REFERER} ? ", $ENV{HTTP_REFERER}" : '';

   my $pid = IPC::Open3::open3(
      '<&STDIN',
      '>&STDOUT',
      local *CHILD_STDERR,
      $^X, $0, @ARGV
   );

   while (<CHILD_STDERR>) {
      print(STDERR $_);
      chomp;
      print($log_fh $prefix, $_, $suffix, "\n");
   }

   waitpid($pid, 0);
   POSIX::_exit(($? & 0x7F) ? ($? & 0x7F) | 0x80 : $? >> 8);
}

BEGIN { self_wrap() if !$ENV{WRAPPED}++; }

【讨论】:

  • 现在还好,下次如果再次宕机,我将添加“CGI::Carp qw(fatalsToBrowser);”查看我的 perl 代码,看看出了什么问题,谢谢
【解决方案2】:

如果您的网站最近被您的托管公司转移到另一台服务器上,或者服务器设置最近已更改,请尝试使用“另存为额外”>>“另存为 UNIX 格式”以 HTML 工具包保存文件,然后上传。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-04
    • 1970-01-01
    • 2017-07-13
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 1970-01-01
    相关资源
    最近更新 更多