2009-11-30 80 views
5

我敢肯定有人可以很快回答這個問題,但我只是新的perl ...爲什麼我的Perl CGI抱怨「腳本頭文件過早結束」?

我想修改demarc(一個簡單的網絡監視工具)做一個簡單的系統調用腳本。腳本本身什麼都不做,我只是想做一個'概念證明',因爲我一直在收到內部服務器錯誤。對腳本的權限已設置爲777.當我評論system()調用時,一切正常。所以這讓我懷疑是系統()調用錯誤發生的地方。我也嘗試過exec(),但那也行不通。錯誤不能在腳本本身中,因爲它只有一個回聲「測試」。

我是否錯過了任何權限或者是否有其他方式使這項工作?任何建議將不勝感激。

sub generate_ticket { 
    my @args = ("$base_path/test.pl"); 
    exec(@args); 
} 

這在文件某處這樣調用:

} elsif ($FORM{'delete_type'}=~/generate/) { 
    my $message = &generate_ticket($delete_array_ref); 
    #&ack_events($delete_array_ref); 
    $events_deleted = (@$delete_array_ref); 
    &push_message("<FONT COLOR=red><B>Result: $message.</B></FONT>"); 
} 

test.pl:

#!/usr/bin/perl 
print "Test"; 

錯誤日誌: [週一11月30日十四時58分22秒2009] [錯誤] [客戶端127.0.0.1]腳本頭過早結束:分界,引用者:http://localhost/dm/demarc?td=show_events&limit=60&sid=35

+1

幫助我們,告訴我們什麼參數系統()或者exec()調用是幫助你。 – 2009-11-30 19:24:50

+0

向我們展示了一些代碼。 – 2009-11-30 19:25:11

+0

修改我的帖子以添加示例代碼... – EDJ 2009-11-30 19:31:18

回答

0

這聽起來像你想從test.pl捕獲輸出。使用systemexec將無法​​實現該目標(並且使用exec,在運行test.pl時,主腳本將不再運行)。

相反,你可以使用反引號:

my $message = `$base_path/test.pl`; 
+0

好吧......現在不是真的,但是,是的,我想在將來抓住它。現在,我只想讓它解決內部服務器錯誤..我現在嘗試反向... – EDJ 2009-11-30 19:39:01

+0

這實際上有效,我將使用此作爲最後的手段。 – EDJ 2009-11-30 20:02:14

+0

如果這個工作,並且系統沒有,有可能你有一個錯誤的路徑嗎? – Geo 2009-11-30 21:26:11

2

你可能想system,不exec

exec函數執行系統命令 永不returns--利用系統 代替exec如果你想讓它返回 。

請參閱exec的文檔。

+0

我嘗試exec()之前嘗試過system(),但它也沒有工作...... :) – EDJ 2009-11-30 19:41:38

+0

'系統'至少不會工作*不同*以某種方式來解決問題。 'exec'完全錯誤。 – hobbs 2009-11-30 21:51:36

+0

@hobss:我明白了。謝謝你的提示。 – EDJ 2009-12-01 14:10:43

1

500 Server Error在Perl的常見問題列表。

您已經確定了腳本命令行運行,對不對?

+0

是的...我首先測試了這個... – EDJ 2009-11-30 20:04:33

2

嗯,我想你必須做的第一件事就是檢查你的web服務器的日誌,它通常有一個理由拋出一個內部服務器錯誤。

+0

檢查它,張貼它作爲我的問題的一部分。 :) – EDJ 2009-11-30 20:06:56

0

最好嘗試一下你想要做的更簡單的版本。

試試這個:

  • 創建類似test2.pl該做簡單的東西。
  • 運行一個簡化的腳本。

    #!/bin/perl 
    use feature 'say'; 
    use strict; 
    use warnings; 
    use Data::Dumper; 
    use English qw<$OS_ERROR>; 
    
    my $rc = system("$base_path/test2.pl"); 
    say "\$rc=$rc"; 
    say $OS_ERROR; 
    

現在,

  1. 如果$rc0。然後它以這種方式執行腳本。否則,$OS_ERROR應該告訴你。
  2. 如果這一切都有效,那麼你可以嘗試執行原始腳本,看看是否也可以。
  3. 如果這有效,那麼它可能是程序在被調用時的狀態。

但是,正如其他人已經指出的,除非您全部完成腳本的運行,否則即使它是一個程序,腳本中的exec也不是您想要做的。這隻會將程序加載到腳本使用的空間上。

使用qx或反引號(`)將允許shell處理命令行,該命令行將處理perl腳本中的shebang(#!)並返回腳本的輸出。

-2

我一直使用QX我的系統的粉絲稱:

my @array = qx(ls -1); 

系統會返回一個字符串,然後還需進行解析,通過QX返回一個數組,如果你知道4號線有你需要的信息,你可以去那裏抓住它。

+0

'system'不返回一個字符串,它返回一個整型返回值,並且根本不捕獲程序的輸出。 'qx'根據上下文返回一行或一行字符串。 – hobbs 2009-11-30 21:50:38

+0

你能指出一些列出qx輸出字符串/數組取決於上下文的文檔嗎?我從來沒有見過這種行爲 – MikeEL 2009-12-01 14:47:18

7

「腳本標題的過早結束」本身並不是非常有用的錯誤消息。它可以用任何數量的東西,比如引起的:

  • 不是可執行文件(權限問題)
  • 沒有彙編(語法錯誤,依賴性問題等)
  • 在正常提前終止執行
  • 產生比相應的HTTP報頭以外的東西作爲腳本的第一輸出

然而,在這種情況下,如果我們從字面上把你的示例腳本(print "TEST"),並且在HTTP標頭之前輸出它,那麼你不會首先生成HTTP標頭,所以它是最後一個。 Web服務器需要標題,而不是「測試」。

如果情況並非如此,我們需要查看更多代碼的上下文以瞭解可能發生的情況。例如,可能是執行test.pl的權限問題。

1

這不是抱怨的Perl CGI,而是Apache。 Apache說你的CGI腳本沒有輸出所需的頭文件,所以這是你需要實現的第一件事。

我總是試着用printenv腳本,例如,

#!/usr/bin/env perl 

use warnings; 
use strict; 

print "Content-type: text/plain\r\n\r\n"; 
print "$_ => $ENV{$_}\r\n" for sort keys %ENV; 

一旦工作,嘗試別的。

2

找到早產的原因之一就是讓錯誤進入瀏覽器。你只需要在應用早期發送Content-Type頭,例如像這樣,在你的代碼的頂部某處:

BEGIN { 
    print "Content-type: text/plain\n\n"; 
} 

現在你應該可以看到錯誤在瀏覽器中。

0

[客戶端127.0.0.1]過早腳本頭端:

你需要(要在瀏覽器中運行的情況下)的內容類型頭的PL文件中聲明。這裏是一個例子:

#!c:/wamp/bin/perl/bin/perl.exe 

print "Content-type: text/html\n\n"; 
print "<html><head><title>Test</title></head>"; 
print "<body>"; 
print "Hello"; 
print "</body></html>"; 

### 

檢查它說的行:print「Content-type:text/html \ n \ n」; < - 這條線是非常重要的

素不相識

相關問題