2009-11-30 11 views
5

मुझे यकीन है कि कोई इसे बहुत जल्दी जवाब दे सकता है, लेकिन मैं सिर्फ perl के लिए नया हूं ...मेरा पर्ल सीजीआई "स्क्रिप्ट हेडर के समयपूर्व अंत" के बारे में क्यों शिकायत करता है?

मैं डेमर्स (एक साधारण नेटवर्क निगरानी उपकरण) को सरल करने के लिए एक सरल कॉल करने के लिए संशोधित करने की कोशिश कर रहा हूं स्क्रिप्ट। स्क्रिप्ट स्वयं कुछ भी नहीं करती है, मैं बस 'सबूत-ऑफ-अवधारणा' करने की कोशिश कर रहा हूं क्योंकि मुझे आंतरिक सर्वर त्रुटि मिल रही है। स्क्रिप्ट को अनुमतियां 777 पर सेट की गई हैं। जब मैं सिस्टम() कॉल पर टिप्पणी करता हूं, तो सब कुछ ठीक है। इसलिए इससे मुझे संदेह होता है कि यह सिस्टम() कॉल है जहां त्रुटि हो रही है। मैंने 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"; 

त्रुटि लॉग: [सोम नवम्बर 30 14:58:22 2009] [ त्रुटि] [ग्राहक 127.0.0.1] स्क्रिप्ट हेडर के समय से पहले अंत: demarc, संदर्भित: http://localhost/dm/demarc?td=show_events&limit=60&sid=35

+1

मदद हमें हमें बता आपके सिस्टम() या कार्यकारी() कॉल करने के लिए तर्क हैं द्वारा आप मदद करते हैं। –

+0

हमें कुछ कोड दिखाएं। –

+0

नमूना कोड जोड़ने के लिए मेरी पोस्ट संशोधित ... – EDJ

उत्तर

0

ऐसा लगता है कि आप आउटपुट को test.pl से कैप्चर करना चाहते हैं। system या exec का उपयोग करना है कि प्राप्त होगा नहीं है (और exec साथ, अपने मुख्य स्क्रिप्ट नहीं चल रहा है समय test.pl से चल जाएगा)।

इसके बजाय, आप इस्तेमाल कर सकते हैं बैकटिक:

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

अच्छा ... वास्तव में अभी नहीं, लेकिन हाँ, मैं इसे भविष्य में कैप्चर करना चाहता हूं। अभी, मैं बस आंतरिक सर्वर त्रुटि प्राप्त करना चाहता हूं .. मैं अभी बैकटिक कोशिश करूंगा .... – EDJ

+0

यह वास्तव में काम करता है, मैं इसे अंतिम उपाय के रूप में उपयोग करूंगा। – EDJ

+0

यदि यह काम करता है, और सिस्टम नहीं करता है, तो क्या यह कहीं संभव है कि आपके पास गलत रास्ता है? – Geo

2

आप शायद system चाहते हैं, नहीं exec:

कार्यकारी समारोह एक प्रणाली कमान और कभी नहीं returns-- उपयोग प्रणाली बजाय कार्यान्वित अगर आप वापसी चाहते हैं तो निष्पादित करें।

exec के लिए प्रलेखन देखें।

+0

मैंने निष्पादन() की कोशिश करने से पहले सिस्टम() पहले कोशिश की, लेकिन यह भी काम नहीं किया ... :) – EDJ

+0

'system' कम से कम काम नहीं करेगा * अलग-अलग * इस तरह से समस्या पर अधिक प्रकाश चमक जाएगा। 'exec' निश्चित रूप से गलत है। – hobbs

+0

@ हॉब्स: मैं देखता हूं। पारितोषिक के लिए धन्यवाद। – EDJ

1

पर्ल पूछे जाने वाले प्रश्न सूची में 500 Server Error देखें।

तुम्हें यकीन स्क्रिप्ट, सही कमांड लाइन से चलाता है बना दिया है?

+0

हां ... मैंने पहले इसका परीक्षण किया ... – EDJ

2

खैर मुझे लगता है कि पहली बात यह है कि आप क्या करना है अपने वेब सर्वर लॉग की जाँच है, यह आमतौर पर एक कारण आंतरिक सर्वर त्रुटि फेंक है।

+0

इसे चेक किया, इसे मेरे प्रश्न के हिस्से के रूप में पोस्ट किया। :) – EDJ

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 या बैकटिक्स (`) का उपयोग करके कमांड लाइन को शैल द्वारा व्याख्या करने की अनुमति मिलेगी जो पर्ल स्क्रिप्ट में शेबैंग्स (#!) को संभालेगी और स्क्रिप्ट के आउटपुट को वापस लाएगी।

-2

मैं हमेशा अपने सिस्टम के लिए qx का उपयोग कर के एक प्रशंसक किया गया है कॉल:

my @array = qx(ls -1); 

प्रणाली एक स्ट्रिंग जो तब पार्स करने की आवश्यकता है देता है, qx एक सरणी देता है द्वारा, और यदि आप लाइन जानते 4 है आपको जो जानकारी चाहिए, आप बस वहां जा सकते हैं और इसे पकड़ सकते हैं।

+0

'system' एक स्ट्रिंग नहीं लौटाता है, यह एक पूर्णांक वापसी मान देता है और प्रोग्राम के आउटपुट को बिल्कुल कैप्चर नहीं करता है। 'qx' संदर्भों के आधार पर लाइनों की सूची * या * एक स्ट्रिंग देता है। – hobbs

+0

क्या आप कुछ दस्तावेज को इंगित कर सकते हैं जो संदर्भ के आधार पर qx outputting string/array सूचीबद्ध करता है? मैंने कभी उस व्यवहार को नहीं देखा है – MikeEL

7

"स्क्रिप्ट हेडर का समयपूर्व अंत" अपने आप पर एक बहुत ही उपयोगी त्रुटि संदेश नहीं है। यह इस तरह के रूप बातें, के एक नंबर के किसी भी कारण हो सकता है:

  • नहीं किया जा रहा निष्पादन योग्य (अनुमतियों की समस्या)
  • संकलन (सिंटेक्स त्रुटि, निर्भरता समस्या, आदि)
  • नियमित दौरान समय से पहले ही समाप्त नाकाम रहने के निष्पादन
  • , इस मामले में अपनी स्क्रिप्ट का पहला उत्पादन के रूप में उचित HTTP हेडर के अलावा कुछ

हालांकि, उत्पादन करता है, तो हम अपने उदाहरण स्क्रिप्ट सचमुच लेने के लिए कर रहे हैं (print "TEST"), और आप इसे अपने HTTP शीर्षलेख से पहले आउटपुट करते हैं, तो आप पहले HTTP शीर्षलेख नहीं बना रहे हैं, इसलिए यह आखिरी है। वेब सर्वर हेडर की अपेक्षा करता है, न कि "परीक्षण।"

यदि ऐसा नहीं है, तो हमें यह जानने के लिए आपके कोड के अधिक संदर्भ को देखने की आवश्यकता है कि क्या हो सकता है। उदाहरण के लिए test.pl निष्पादित करने की अनुमति अनुमति हो सकती है।

1

यह पर्ल सीजीआई नहीं है जो शिकायत करता है, लेकिन अपाचे। अपाचे का कहना है कि आपकी सीजीआई स्क्रिप्ट आवश्यक हेडर को आउटपुट नहीं कर रही है, इसलिए यह पहली चीज है जिसे आपको हासिल करने की आवश्यकता है।

मैं हमेशा पहले printenv स्क्रिप्ट के साथ CGI का प्रयास करता हूं, उदा।

#!/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

समय-समय पर कारण ढूंढने का एक तरीका यह है कि त्रुटियों को ब्राउज़र पर जाना है।तुम बस सामग्री प्रकार शीर्षक, इस तरह उदाहरण के लिए, अपने कोड के शीर्ष पर कहीं आवेदन में जल्दी भेजने के लिए:

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>"; 

### 

जांच लाइन यह कहता है: यहाँ एक उदाहरण है प्रिंट "सामग्री के प्रकार: पाठ/html \ n \ n"; < - इस पंक्ति बहुत महत्वपूर्ण है

Grettings

संबंधित मुद्दे

 संबंधित मुद्दे