2012-02-22 6 views
6

मैं एक पर्ल स्क्रिप्ट लिख रहा हूं (script.pl कहें) जो एक और स्क्रिप्ट newscript.pl कहता है। मैं केवल script.pl में दोनों स्क्रिप्ट के पीआईडी ​​प्राप्त करना चाहता हूं। मैं निम्नलिखित कोडमैं पर्ल के सिस्टम फ़ंक्शन के साथ उत्पन्न प्रक्रिया की पीआईडी ​​कैसे प्राप्त करूं?

my $pid = Unix::PID->new(); 
my @p = $pid->get_pidof($pid->get_command($$), 1); 

का उपयोग कर इस मैं system फोन के बाद निष्पादित करने के लिए newscript.pl

system("perl newscript.pl"); 

मैं पीआईडी ​​script.pl में इस newscript.pl द्वारा उत्पन्न कैप्चर करना चाहते द्वारा script.pl की पीआईडी ​​मिल सकती है।

उत्तर

5

system रिटर्न के समय तक, उत्पन्न प्रक्रिया पहले से ही निकल जाएगी, उदाहरण के लिए लॉग विश्लेषण के लिए उपयोगी एक दिलचस्प ऐतिहासिक संदर्भ — के रूप में अपने पिड को छोड़ दिया जाएगा।

system LIST
system PROGRAM LIST

वास्तव में सिवाय इसके कि एक fork किया जाता है पहले और माता पिता प्रक्रिया बच्चे की प्रक्रिया के लिए इंतजार कर रहा है है & hellip बाहर निकलने के लिए, exec LIST के रूप में एक ही बात करता है;

तुम दोनों script.pl और newscript.pl, fork की पीआईडी ​​चाहते हैं और अपने आप को अपने जीवनकाल का प्रबंधन करते हैं। समस्या के बारे में अधिक विशिष्ट जानकारी के साथ आप ’ फिर से निपटने के साथ, हम आपको अधिक विशिष्ट सुझाव दे सकते हैं।


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

#! /usr/bin/env perl 

use strict; 
use warnings; 

use Fcntl qw/ :flock /; 
use File::Basename; 
use POSIX qw/ strftime /; 

$0 = basename $0; 

my $LOCK = "$ENV{HOME}/.lock-$0"; 

sub logmsg { 
    my($msg) = @_; 
    my $t = strftime "%F %T", localtime time; 
    warn "$0: $t - $$ - $msg\n"; 
} 

sub take_lock { 
    open my $fh, ">", $LOCK or die "$0: open $LOCK: $!"; 

    unless (flock $fh, LOCK_EX | LOCK_NB) { 
    logmsg "failed to lock $LOCK; exiting."; 
    exit 1; 
    } 

    $fh; 
} 

my $token = take_lock; 
logmsg "processing..."; 
sleep 2 * 60; 
logmsg "done."; 

ध्यान दें कि आप filehandle रखना चाहिए take_lock खुला से लौटे जबकि नियंत्रण अपने critical section के अंदर है। उपरोक्त कोड इसे एक अपारदर्शी टोकन के रूप में मानता है। जब आपका प्रोग्राम निकलता है, तो पर्ल फ़ाइलहेडल बंद कर देता है, जो स्वचालित रूप से लॉक जारी करता है। आप क्या करते हैं ’ टी करना चाहते हैं take_lock शून्य संदर्भ में कॉल करें क्योंकि यह आपके लॉक को त्याग देगा।

+0

मेरी script.pl अन्य अन्य स्क्रिप्ट जैसे newscript.pl और अन्य स्क्रिप्ट्स को शेड्यूल करने का कार्य करता है। मैं उन्हें सीधे क्रॉन में शेड्यूल करने के बारे में नहीं जा सकता और इसलिए इस मूल लिपि को बनाने का विचार किया जो शेड्यूलर के रूप में कार्य करेगा। अब, एक ऐसा मामला हो सकता है जब अनुसूचित स्क्रिप्ट दोहराई जाती है क्योंकि मुझे MySQL डेटाबेस से स्क्रिप्ट नाम मिलते हैं, मुझे वह स्क्रिप्ट नहीं चाहिए जो पहले से निष्पादित करने के लिए चल रही है और इसलिए मैं सोच रहा था कि क्या मैं अनुसूचित स्क्रिप्ट के पीआईडी ​​को कैप्चर कर सकता हूं, मैं इन पिड्स के आधार पर जांच कर सकता हूं और उसी स्क्रिप्ट के साथ-साथ दौड़ से बच सकता हूं।धन्यवाद आपकी मदद के लिए एक टन – Deepak

+0

क्या कांटा के बिना इसे करने का कोई और तरीका है? – Deepak

+0

यदि आपको विशिष्टता की आवश्यकता है तो 'झुंड() 'का उपयोग करें। 'Fcntl qw (: झुंड) का उपयोग करें; झुंड ($ lockfd, LOCK_NB | LOCK_EX) या मरें "वही स्क्रिप्ट पहले से ही जा रही है"; # ... 'ध्यान दें कि $ lockfd एक फ़ाइल डिस्क्रिप्टर है और फ़ाइल नाम नहीं है (आपको इसे झुंड से पहले खोलना है)। – Dallaylaen

9

वर्तमान प्रक्रिया की प्रक्रिया संख्या $$ में है। बाल प्रक्रिया की प्रक्रिया संख्या प्राप्त करने के लिए system के बजाय open3 का उपयोग करें।

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

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