2010-01-25 10 views
11

क्या कोई मुझे बता सकता है कि पर्ल में एक प्रक्रिया को कैसे आग लगाना और भूलना है? रूबी में ऐसा करने के लिए मैंने पहले ही ruby: how to fire and forget a subprocess? देखा है।मैं पर्ल में एक प्रक्रिया को कैसे आग और भूल सकता हूं?

उत्तर

17

perlfaq8 के जवाब से How do I start a process in the background? को


कई मॉड्यूल अन्य प्रक्रियाओं है कि आपके पर्ल कार्यक्रम को ब्लॉक नहीं करती शुरू कर सकते हैं। आप आईपीसी :: ओपन 3, समांतर :: जॉब्स, आईपीसी :: रन, और पीओई मॉड्यूल का उपयोग कर सकते हैं। अधिक जानकारी के लिए सीपीएएन देखें।

तुम भी

system("cmd &") 

इस्तेमाल कर सकते हैं या के रूप में perlfunc में "कांटा" में प्रलेखित, perlipc में आगे उदाहरण के साथ आप कांटा इस्तेमाल कर सकते हैं। यदि आप सिस्टम की तरह एक यूनिक्स पर हैं कुछ बातें, के बारे में पता होना करने के लिए:

STDIN, STDOUT, और STDERR साझा कर रहे हैं

दोनों मुख्य प्रक्रिया और backgrounded एक ("बच्चे" प्रक्रिया) एक ही STDIN, STDOUT और STDERR फ़ाइल हैंडल साझा करें। यदि दोनों एक बार में उन्हें एक्सेस करने का प्रयास करते हैं, तो अजीब चीजें हो सकती हैं। आप बच्चे के लिए इन्हें बंद या फिर से खोलना चाहते हैं। आप "खुला" एक पाइप ing साथ इस के आसपास मिलता है (देखें perlfunc में "खुला") कर सकते हैं लेकिन कुछ सिस्टम पर इसका मतलब है कि बच्चे प्रक्रिया माता पिता से अधिक जीवित नहीं कर सकते।

सिग्नल

आप होगा SIGCHLD संकेत पकड़ने, और संभवतः भी SIGPIPE करने के लिए। पृष्ठभूमि प्रक्रिया समाप्त होने पर SIGCHLD भेजा जाता है। SIGPIPE भेजा है जब आप एक filehandle जिसका बच्चा प्रक्रिया बंद कर दिया है (एक untrapped SIGPIPE अपने कार्यक्रम के कारण चुपचाप मरने के लिए कर सकते हैं) के लिए लिखते हैं। यह "सिस्टम (" cmd & ")" के साथ कोई समस्या नहीं है।

Zombies

आप बच्चे प्रक्रिया जब यह खत्म "काटते" करने के लिए तैयार किया जाना है।

$SIG{CHLD} = sub { wait }; 

    $SIG{CHLD} = 'IGNORE'; 

आप एक डबल कांटा भी उपयोग कर सकते हैं। आप तुरंत अपने पहले बच्चे के लिए प्रतीक्षा करें() और इनिट डिमन आपके पोते के बाहर निकलने के बाद प्रतीक्षा करेगा()।

unless ($pid = fork) { 
     unless (fork) { 
      exec "what you really wanna do"; 
      die "exec failed!"; 
     } 
     exit 0; 
    } 
    waitpid($pid, 0); 

देखें कोड के अन्य उदाहरण के लिए perlipc में "सिग्नल" यह करने के लिए। लाश "सिस्टम (" प्रोग & ") के साथ कोई समस्या नहीं है"।

+0

बहुत बहुत धन्यवाद, मैंने कमांड में पृष्ठभूमि खोल ऑपरेटर का उपयोग नहीं किया था। वह चाल है। दुर्भाग्य से मैं दूसरों का उपयोग नहीं कर सकता क्योंकि मैं लगभग कोई मॉड्यूल के साथ गंभीर रूप से सीमित सिस्टम पर काम कर रहा हूं। –

+0

आह यह सही है, अगर तुम 'और' चार इसे तुरंत वापस आती है, इस प्रकार बैक-टिक ऑपरेटर विधि मैं सुझाव दिया था इतना अच्छा नहीं था के साथ एक प्रणाली() आदेश जारी - पर्ल के सिस्टम कॉल का उपयोग करने के बजाय एक पूरी कॉल करने के लिए बेहतर खोल की नई प्रति। –

1

आप अपने पर्ल स्क्रिप्ट daemonize को मैं Proc::Daemon.

+0

दरअसल, मैं इसे डिमननाइज़ नहीं करना चाहता हूं, मुझे बस अपनी मुख्य लिपि के निष्पादन की अवधि के लिए पृष्ठभूमि में एक वॉचडॉग स्क्रिप्ट लॉन्च करने की आवश्यकता है। और मेरे पास काम करने के लिए केवल मूल पर्ल 5.6.0 है, क्योंकि यह एम्बेडेड सिस्टम पर गंभीर रूप से सीमित स्मृति के साथ निष्पादित है और मेरे पास काम करने के लिए बहुत अधिक मॉड्यूल नहीं हैं। –

0

में देख रहा था वैसे आप system() उपयोग नहीं करना चाहिए के रूप में मैं समझता हूँ कि इस कॉल के निष्पादन जारी रखने से पहले समारोह की वापसी के लिए इंतजार करेंगे चाहते हैं। मैं बस linux के लिए बाहर शेल और प्रक्रिया है कि जिस तरह से शुरू होगा, हालांकि ध्यान इस तरह से खोल की एक नई प्रतिलिपि envoke होगा और इसलिए आप प्रदर्शन के लिए देख रहे हैं मैं उदाहरण के लिए एक पाश में ऐसा नहीं होता रखें:

process_name > /dev/null 2>&1 &;

इससे STDOUT और STDERR से /dev/null पर रीडायरेक्ट प्रक्रिया शुरू हो जाएगी।

0

आप प्रहरी "बच्चा" प्रक्रिया दूर जाना जब "जनक" प्रक्रिया बाहर निकल जाता है चाहते हैं, तो आप वास्तव में माता-पिता की प्रक्रिया के लिए "आग और भूल जाओ" नहीं चाहता बच्चे प्रक्रिया है। आपको या तो फोर्क की आवश्यकता है (जैसा ब्रायन डी फोय द्वारा वर्णित है) या माता-पिता के पीआईडी ​​को बच्चे को पास करें (इसलिए उत्तरार्द्ध प्रक्रिया तालिका को मतदान कर सकता है - अनुशंसित नहीं)।

+0

वास्तव में, एक बच्चे की प्रक्रिया के रूप में एक प्रहरी स्क्रिप्ट चलाने शायद एक बुरा विचार के बाद से शायद प्रहरी मुख्य स्क्रिप्ट अप्रत्याशित रूप से मर जाता है कुछ करने के लिए माना जाता है (लेकिन अगर माता-पिता मर जाता है तो उसके सभी बच्चों करते हैं)। दूसरा तरीका इस प्रकार है, जबकि प्रहरी (सच में शुरू मोड के माध्यम से "मुख्य प्रक्रिया" एक नामित पाइप की स्थापना की है और "दिल की धड़कन" संदेश लिखने यह बाहर निकलने पर एक "किया" संदेश + करने के लिए "आग और भूल जाओ" करने के लिए है प्रणाली ("cmd &")) जब या तो "किया" संदेश आता है या "दिल की धड़कन" संदेश आ रहा रोक नामित पाइप और नोटिस से पढ़ता है। – Peter

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