2008-09-05 16 views
6

विंडोज़ पर चलते समय मुझे पर्ल सीजीआई स्क्रिप्ट से प्रक्रियाओं को तोड़ने में कुछ परेशानी हुई है। मुख्य मुद्दा यह प्रतीत होता है कि खिड़कियों पर चलते समय 'कांटा' नकल किया जाता है, और वास्तव में एक नई प्रक्रिया (वर्तमान में एक और धागा) नहीं लग रहा है। इसका अर्थ यह है कि वेब सर्वर (जैसे आईआईएस) जो प्रक्रिया समाप्त होने की प्रतीक्षा कर रहे हैं, 'पृष्ठभूमि' प्रक्रिया समाप्त होने तक प्रतीक्षा जारी रखें।मैं विंडोज पर एक पर्ल CGI स्क्रिप्ट से पृष्ठभूमि प्रक्रियाओं को कैसे फोर्क कर सकता हूं?

क्या विंडोज के तहत एक सीजीआई स्क्रिप्ट से पृष्ठभूमि प्रक्रिया को तोड़ने का कोई तरीका है? इससे भी बेहतर, क्या एक ऐसा फ़ंक्शन है जिसे मैं कॉल कर सकता हूं जो इसे क्रॉस प्लेटफ़ॉर्म तरीके से करेगा?

(और केवल जीवन को और अधिक कठिन बनाने के लिए, मुझे वास्तव में एक ही समय में फोर्क किए गए प्रक्रिया आउटपुट को रीडायरेक्ट करने का एक अच्छा तरीका चाहिए)।

उत्तर

9

आप एक मंच स्वतंत्र तरह से यह करने के लिए चाहते हैं, Proc::Background शायद सबसे अच्छा तरीका है।

0

perlfork:

पर्ल एक कांटा() कीवर्ड कि एक ही नाम के यूनिक्स प्रणाली कॉल से मेल खाती है प्रदान करता है। अधिकांश यूनिक्स-जैसे प्लेटफॉर्म पर जहां कांटा() सिस्टम कॉल उपलब्ध है, पर्ल का कांटा() बस इसे कॉल करता है।

जैसे Windows के रूप में कुछ प्लेटफॉर्म जहां कांटा() सिस्टम कॉल उपलब्ध नहीं है पर, पर्ल दुभाषिया स्तर पर अनुकरण कांटा() करने के लिए बनाया जा सकता है। अनुकरण डिज़ाइन किया गया है असली कांटा() पर्ल कार्यक्रम के स्तर पर के साथ संभव के रूप में संगत होना, कुछ महत्वपूर्ण अंतर है कि से स्टेम तथ्य हैं कि सभी छद्म बच्चे `` प्रक्रियाओं ' में उसी तरह से वास्तविक प्रक्रिया को ऑपरेटिंग सिस्टम से संबंधित है, इस तरह से बनाया गया है। DETACHED_PROCESS पैरामीटर के साथ

0

मुझे विंडोज पर फोर्क() के साथ वास्तविक समस्याएं मिली हैं, खासकर जब पर्ल में Win32 ऑब्जेक्ट्स से निपटने में। इस प्रकार, यदि यह विंडोज विशिष्ट होने जा रहा है, तो मैं वास्तव में आपको पर्ल के भीतर थ्रेड लाइब्रेरी को देखने की सलाह दूंगा।

मैं आईआईएस का उपयोग करने वाली वेबसाइटों पर एक समय में एक से अधिक कनेक्शन स्वीकार करने के अच्छे प्रभाव के लिए इसका उपयोग करता हूं, और फिर एक ही समय में अलग-अलग स्क्रिप्ट निष्पादित करने के लिए और भी थ्रेड का उपयोग करता हूं।

0

यह प्रश्न बहुत पुराना है, और स्वीकृत उत्तर सही है। हालांकि, मुझे बस यह काम करने के लिए मिला, और लगा कि मैं इसे किसी भी व्यक्ति के लिए इसे पूरा करने के तरीके के बारे में कुछ और विवरण जोड़ूंगा।

निम्न कोड एक बहुत बड़ी perl CGI स्क्रिप्ट में मौजूद है। यह विशेष उप दिनचर्या कई टिकट प्रणालियों में टिकट बनाती है, फिर ट्विलियो सेवाओं के माध्यम से स्वचालित कॉल करने के लिए लौटाई गई टिकट संख्याओं का उपयोग करती है। कॉल थोड़ी देर लेता है, और मैं नहीं चाहता था कि सीजीआई उपयोगकर्ताओं को तब तक इंतजार करना पड़े जब तक कॉल उनके अनुरोध से आउटपुट देखने के लिए समाप्त न हो जाए।

(All the CGI code that is standard stuff. Calls the subroutine needed, and then) 

    my $randnum = int(rand(100000)); 
    my $callcmd = STL_DIR . "/aoff-caller.pl --uniqueid $uuid --region $region --ticketid $ticketid"; 
    my $daemon = Proc::Daemon->new(
    work_dir  => STL_DIR, 
    child_STDOUT => TMP_DIR . '/stdout.txt', 
    child_STDERR => TMP_DIR . '/stderr.txt', 
    pid_file  => TMP_DIR . '/' . $randnum . '-pid.txt', 
    exec_command => $callcmd, 
); 
    my $pid = $daemon->Init(); 

    exit 0; 

    (kill CGI at the appropriate place) 

मुझे यकीन है कि यादृच्छिक उत्पन्न और पीआईडी ​​से जुड़ी संख्या overkill है हूँ, लेकिन मैं मुद्दों है कि अत्यंत आसानी से परहेज कर रहे हैं बनाने में कोई दिलचस्पी नहीं है: इसके लिए मैं निम्नलिखित किया था। उम्मीद है कि यह किसी को भी इसी तरह की चीज करने में मदद करता है। अपनी स्क्रिप्ट के शीर्ष पर use Proc::Daemon जोड़ने के लिए याद रखें, कोड को दर्पण करें और अपने प्रोग्राम के पथों और नामों में बदलें, और आपको जाने के लिए अच्छा होना चाहिए।

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

  • कोई संबंधित समस्या नहीं^_^