2014-09-30 56 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;它現在對我來說