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
शून्य संदर्भ में कॉल करें क्योंकि यह आपके लॉक को त्याग देगा।
स्रोत
2012-02-22 12:00:53
मेरी script.pl अन्य अन्य स्क्रिप्ट जैसे newscript.pl और अन्य स्क्रिप्ट्स को शेड्यूल करने का कार्य करता है। मैं उन्हें सीधे क्रॉन में शेड्यूल करने के बारे में नहीं जा सकता और इसलिए इस मूल लिपि को बनाने का विचार किया जो शेड्यूलर के रूप में कार्य करेगा। अब, एक ऐसा मामला हो सकता है जब अनुसूचित स्क्रिप्ट दोहराई जाती है क्योंकि मुझे MySQL डेटाबेस से स्क्रिप्ट नाम मिलते हैं, मुझे वह स्क्रिप्ट नहीं चाहिए जो पहले से निष्पादित करने के लिए चल रही है और इसलिए मैं सोच रहा था कि क्या मैं अनुसूचित स्क्रिप्ट के पीआईडी को कैप्चर कर सकता हूं, मैं इन पिड्स के आधार पर जांच कर सकता हूं और उसी स्क्रिप्ट के साथ-साथ दौड़ से बच सकता हूं।धन्यवाद आपकी मदद के लिए एक टन – Deepak
क्या कांटा के बिना इसे करने का कोई और तरीका है? – Deepak
यदि आपको विशिष्टता की आवश्यकता है तो 'झुंड() 'का उपयोग करें। 'Fcntl qw (: झुंड) का उपयोग करें; झुंड ($ lockfd, LOCK_NB | LOCK_EX) या मरें "वही स्क्रिप्ट पहले से ही जा रही है"; # ... 'ध्यान दें कि $ lockfd एक फ़ाइल डिस्क्रिप्टर है और फ़ाइल नाम नहीं है (आपको इसे झुंड से पहले खोलना है)। – Dallaylaen