क्या कोई मुझे बता सकता है कि पर्ल में एक प्रक्रिया को कैसे आग लगाना और भूलना है? रूबी में ऐसा करने के लिए मैंने पहले ही ruby: how to fire and forget a subprocess? देखा है।मैं पर्ल में एक प्रक्रिया को कैसे आग और भूल सकता हूं?
उत्तर
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 में "सिग्नल" यह करने के लिए। लाश "सिस्टम (" प्रोग & ") के साथ कोई समस्या नहीं है"।
आप अपने पर्ल स्क्रिप्ट daemonize को मैं Proc::Daemon.
दरअसल, मैं इसे डिमननाइज़ नहीं करना चाहता हूं, मुझे बस अपनी मुख्य लिपि के निष्पादन की अवधि के लिए पृष्ठभूमि में एक वॉचडॉग स्क्रिप्ट लॉन्च करने की आवश्यकता है। और मेरे पास काम करने के लिए केवल मूल पर्ल 5.6.0 है, क्योंकि यह एम्बेडेड सिस्टम पर गंभीर रूप से सीमित स्मृति के साथ निष्पादित है और मेरे पास काम करने के लिए बहुत अधिक मॉड्यूल नहीं हैं। –
में देख रहा था वैसे आप system()
उपयोग नहीं करना चाहिए के रूप में मैं समझता हूँ कि इस कॉल के निष्पादन जारी रखने से पहले समारोह की वापसी के लिए इंतजार करेंगे चाहते हैं। मैं बस linux के लिए बाहर शेल और प्रक्रिया है कि जिस तरह से शुरू होगा, हालांकि ध्यान इस तरह से खोल की एक नई प्रतिलिपि envoke होगा और इसलिए आप प्रदर्शन के लिए देख रहे हैं मैं उदाहरण के लिए एक पाश में ऐसा नहीं होता रखें:
process_name > /dev/null 2>&1 &
;
इससे STDOUT
और STDERR
से /dev/null पर रीडायरेक्ट प्रक्रिया शुरू हो जाएगी।
आप प्रहरी "बच्चा" प्रक्रिया दूर जाना जब "जनक" प्रक्रिया बाहर निकल जाता है चाहते हैं, तो आप वास्तव में माता-पिता की प्रक्रिया के लिए "आग और भूल जाओ" नहीं चाहता बच्चे प्रक्रिया है। आपको या तो फोर्क की आवश्यकता है (जैसा ब्रायन डी फोय द्वारा वर्णित है) या माता-पिता के पीआईडी को बच्चे को पास करें (इसलिए उत्तरार्द्ध प्रक्रिया तालिका को मतदान कर सकता है - अनुशंसित नहीं)।
वास्तव में, एक बच्चे की प्रक्रिया के रूप में एक प्रहरी स्क्रिप्ट चलाने शायद एक बुरा विचार के बाद से शायद प्रहरी मुख्य स्क्रिप्ट अप्रत्याशित रूप से मर जाता है कुछ करने के लिए माना जाता है (लेकिन अगर माता-पिता मर जाता है तो उसके सभी बच्चों करते हैं)। दूसरा तरीका इस प्रकार है, जबकि प्रहरी (सच में शुरू मोड के माध्यम से "मुख्य प्रक्रिया" एक नामित पाइप की स्थापना की है और "दिल की धड़कन" संदेश लिखने यह बाहर निकलने पर एक "किया" संदेश + करने के लिए "आग और भूल जाओ" करने के लिए है प्रणाली ("cmd &")) जब या तो "किया" संदेश आता है या "दिल की धड़कन" संदेश आ रहा रोक नामित पाइप और नोटिस से पढ़ता है। – Peter
- 1. मैं जेएस फ़ंक्शन को कैसे 'आग और भूल सकता हूं'? (वापसी के लिए प्रतीक्षा न करें)
- 2. मैं पर्ल में एक स्ट्रिंग को कैसे लपेट सकता हूं?
- 3. "आग और भूल" कार्य के लिए वेब सेवा में ThreadPool.QueueUserWorkItem
- 4. मैं एक और प्रक्रिया मेमोरी पर कैसे लिख सकता हूं?
- 5. मैं पर्ल में एक सशर्त प्रतिस्थापन कैसे कर सकता हूं?
- 6. मैं पर्ल में एक बाइनरी फ़ाइल कैसे बना सकता हूं?
- 7. मैं अर्धविराम भूल गया ";" एक MySQL टर्मिनल क्वेरी में। मैं कैसे बाहर निकल सकता हूं?
- 8. मैं पर्ल में एक्सेल फ़ाइलों को कैसे पढ़ सकता हूं?
- 9. मैं पर्ल में एक सरणी कैसे छोटा कर सकता हूं?
- 10. मैं पर्ल में तिथियों को कैसे सत्यापित कर सकता हूं?
- 11. मैं पर्ल में कॉलम आउटपुट कैसे बना सकता हूं?
- 12. मैं पर्ल में तिथियों को कैसे क्रमबद्ध कर सकता हूं?
- 13. बूस्ट: आग और एसिंक्रोनस फ़ंक्शन कॉल भूल जाओ?
- 14. मैं पर्ल क्लास कैसे बना सकता हूं?
- 15. मैं postgresql में संग्रहीत प्रक्रिया को कैसे हटा सकता हूं?
- 16. मैं लिनक्स में कैसे कह सकता हूं जिस प्रक्रिया ने मेरी प्रक्रिया को एक सिग्नल
- 17. मैं पर्ल और मूस में एक कारखाने को कैसे कोड कर सकता हूं?
- 18. मैं पर्ल आउटपुट दोनों को STDOUT और एक चर में कैसे भेज सकता हूं?
- 19. मैं अक्का में एक अस्थायी अभिनेता को कैसे ठीक से आग लगा सकता हूं?
- 20. मैं एक पर्ल कार्यक्रम में अस्थायी रूप से STDOUT को कैसे दबा सकता हूं?
- 21. मैं पर्ल से एक PHP स्क्रिप्ट कैसे लगा सकता हूं?
- 22. मैं एएसपी क्लासिक में एसिंक्रोनस कॉल कैसे आग लगा सकता हूं और प्रतिक्रिया को अनदेखा कर सकता हूं?
- 23. मैं पर्ल में एक इनपुट फ़ाइल को यूटीएफ -8 एन्कोडिंग में कैसे परिवर्तित कर सकता हूं?
- 24. मैं बाहरी कमांड कैसे चला सकता हूं और पर्ल में अपना आउटपुट कैप्चर कर सकता हूं?
- 25. कैसे एक उपप्रजाति को आग और भूलना है?
- 26. मैं पर्ल में एक स्ट्रिंग को एक नंबर में कैसे परिवर्तित कर सकता हूं?
- 27. मैं चल रहे पर्ल प्रक्रिया में डीबगर कैसे संलग्न कर सकता हूं?
- 28. मैं मेकफ़ाइल से पर्ल एक लाइनर कैसे चला सकता हूं?
- 29. क्या मैं एक कंप्यूटर में स्ट्रॉबेरी पर्ल और एक्टिवस्टेट पर्ल का उपयोग कर सकता हूं?
- 30. मैं पर्ल में बच्चे के साथ एक अभिभावक वर्ग समारोह को कैसे ओवरराइड कर सकता हूं?
बहुत बहुत धन्यवाद, मैंने कमांड में पृष्ठभूमि खोल ऑपरेटर का उपयोग नहीं किया था। वह चाल है। दुर्भाग्य से मैं दूसरों का उपयोग नहीं कर सकता क्योंकि मैं लगभग कोई मॉड्यूल के साथ गंभीर रूप से सीमित सिस्टम पर काम कर रहा हूं। –
आह यह सही है, अगर तुम 'और' चार इसे तुरंत वापस आती है, इस प्रकार बैक-टिक ऑपरेटर विधि मैं सुझाव दिया था इतना अच्छा नहीं था के साथ एक प्रणाली() आदेश जारी - पर्ल के सिस्टम कॉल का उपयोग करने के बजाय एक पूरी कॉल करने के लिए बेहतर खोल की नई प्रति। –