2014-09-30 53 views
1

我对诊断perl问题非常棘手,这严重阻碍了我维护perl/cgi网站的能力。它通常发生在编辑脚本时 - 更改后我得到错误500,然后在恢复后它不会再次工作,除非我删除文件并从头开始,但是我目前有一个状态,可以通过以下方式进行复制简单的两个脚本,显示此错误是多么疯狂的是:使用perl cgi时发生错误500 - 但不是任何常见陷阱

file1.pl

#! /usr/bin/perl 
use CGI::Carp qw(fatalsToBrowser warningsToBrowser); 
print "content-type: text/html\n\nIt works"; 

file2.pl

#! /usr/bin/perl 
use CGI::Carp qw(fatalsToBrowser warningsToBrowser); 
print "content-type: text/html\n\nIt works"; 

(即...他们是相同的)

server.com/cgi-bin/file1.pl工作在误差500

server.com/cgi-bin/file2.pl结果这两个文件具有相同的大小和MD5哈希值。 两者具有相同的权限(755)和相同的所有者和组。 两者都在正确的文件夹(托管提供的cgi-bin)。 两者均以文本模式上传。 两者都与当地的Perl解释器一起工作。

如果我重命名file1-> file3,file2-> file1和file3-> file2(即交换两个文件),现在file2.pl工作,file1.pl不工作。所以我的猜测是某些状态会附加到文件本身。

如果我编辑filezilla中的文件并重新上传(例如在分号后添加一些空格),重新上传的文件也会发生同样的行为。

我的错误500页被设置为使用元刷新自动重试(如果出现内存错误等),并且在无数次刷新后它不会消失。首先访问哪一个似乎并不重要。

我无法访问此主机上的http error_log,因此不知道失败的原因。如果没有“使用浏览器的错误消息”诊断行,也会出现该错误。

任何人都可以给我一个暗示,这可能是什么,并帮助我解决它?

+0

。‘我没有访问HTTP的error_log这个托管’这使事情变得相当困难... – ThisSuitIsBlackNot 2014-09-30 18:07:05

+0

你是怎么上传工作的文件?'file1.pl' – TLP 2014-09-30 18:12:47

+0

这个问题响起了一个钟......我确定我已经阅读过关于它或类似的地方。你有没有使用过吗? – 2014-09-30 18:19:02

回答

0

我的猜测:这些文件不使用相同的newline convention。 您可以使用the file command来检查此操作(在Unix shell中)。

+1

这似乎不太可能,如果文件具有相同的散列。 – 2014-09-30 20:52:30

+1

我没有访问shell的权限,所以无法执行该命令.-但它们在服务器上的字节大小相同,因此它不是CRLF和LF不匹配。 – 2014-09-30 20:59:51

+0

是否使用任何远程文件系统(NFS,CIFS,...)?您使用哪种操作系统来比较大小和散列,以及Web服务器使用哪个操作系统? – reinierpost 2014-10-01 11:02:53

2

你所描述的可能是由你的托管服务提供者方面的一些问题引起的(一些错误的缓存,或者透明代理或者其他任何魔术),或者我认为这是由于错误的文件导致的权限或换行符,即使您的文件管理器报告一切都很好。

如果我正确地读你的描述,你基本上

  • 可以把一个脚本,它会工作,但
  • 不能编辑它,因为它会停止后工作。

当你没有shell访问,只要把下面的小脚本到同一个目录并运行它(希望这将运行你不打算对其进行编辑):

#!/usr/bin/perl 
use strict; 
use warnings; 

print "Content-Type: text/plain\n\n"; 

opendir(my $dirh, "."); 
my @files = grep { -f $_; } readdir $dirh; 
closedir $dirh; 

foreach my $file (@files) { 
    my @stat = stat $file; 
    my ($dev, $ino, $mode, $nlink, $uid,  $gid, $rdev, 
     $size, $atime, $mtime, $ctime, $blksize, $blocks 
    ) = stat($file); 
    my $octmode = sprintf "%04o", $mode & 07777; 
    print "$file\tmode=$octmode\tuid=$uid\tgid=$gid\tsize=$size\t"; 
    if (-r $file) { 
     open(my $fh, $file); 
     my $firstline = <$fh>; 
     print $firstline =~ /\r\n/ ? "crlf\n" : "lf\n"; 
     close $fh; 
    } else { 
     print "can't read\n"; 
    } 
} 

它将显示真实的权限,换行符和文件大小 - 这些文件是从服务器的文件系统获取的,而不是您的FTP客户端显示的。

也许值得添加MD5或SHA1哈希计算到这个脚本,但不知道如果你有Digest::MD5Digest::SHA1可用。

如果您看到test1.pltest2.pl的输出相同,请继续并联系您的托管提供商的支持。

0

无法检查错误日志是一件非常头疼的事情。

尽管如此,我怀疑原因仍然是最后的结局。我想上传一个脚本来检查所有文件以下列方式:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use autodie; 

use CGI qw(header); 
use CGI::Carp qw(fatalsToBrowser warningsToBrowser); 
use File::stat; 

print header('text/plain'); 

my $fmt = "%-15s %4s %4s %4s %7s %4s %4s\n"; 
printf $fmt, qw(File mode uid gid size lf crlf); 
printf $fmt, map { '-' x $_ } $fmt =~ /(\d+)/g; 

opendir my $dh, '.'; 
while (my $file = readdir $dh) { 
    next unless -f $file; 

    my $stat = stat $file; 

    my %chars; 
    my $data = do { local (@ARGV, $/) = $file; <> }; 
    $chars{$1}++ while $data =~ /(\R)/g; 

    printf $fmt, $file, sprintf("%04o", $stat->mode & 07777), $stat->uid, 
     $stat->gid, $stat->size, map { $_ // 0 } @chars{ "\n", "\r\n" }; 
} 

输出:

Content-Type: text/plain; charset=ISO-8859-1 

File   mode uid gid size lf crlf 
--------------- ---- ---- ---- ------- ---- ---- 
env.cgi   0775 0 0  266 25 0 
le.pl   0775 501 0  696 28 0 
lineendings.pl 0755 501 0  516 30 0 
mywiki.pl  0755 501 0 226947 0 6666 
test.cgi  0755 0 0 2071 65 0 
wiki.pl   0755 0 0 219231 6494 0 

对于额外的测试,我建议每个脚本的使用system执行和检查错误条件如果有的话。

0

我有同样的问题,得到了如下的用户BOC帮助: “你可能有字符的编码问题的一些编辑器非常接近的字符替换一些字符时您保存文件(例如”经“) 。尝试更改编辑器(记事本++在Windows上运行良好)。 - 中国银行” 我下载并使用记事本+ +,而不是记事本中Winword;它现在对我来说