2009-09-29 11 views
7

मैं एक यूनिक्स मशीन पर पृष्ठभूमि में कुछ समय (1) लूप के साथ एक पर्ल स्क्रिप्ट चलाने के लिए चाहता हूं जब तक कि मैं इसे मारूं।अगर मैं लॉग आउट करता हूं तो भी मैं पृष्ठभूमि में एक यूनिक्स प्रोग्राम कैसे चला सकता हूं?

यह एक दूरस्थ कंप्यूटर है जिसके लिए मेरे पास व्यवस्थापकीय अनुमतियां नहीं हैं (इसलिए किसी कारण से, मैं डेमन :: जेनेरिक :: जबकि 1 का उपयोग नहीं कर सकता), मैं इसे एसएसएच के माध्यम से लॉग करता हूं, और मैं इसे चाहता हूं लॉग आउट करने के बाद दौड़ना जारी रखें।

nohup ./my_script.pl & 

वहाँ कुछ अन्य, अधिक बेहतर यह करने के लिए रास्ता नहीं है:

एक तरह से मुझे पता चला बैश के लिए कुछ इस तरह लिखना है?

क्रॉन्टाब को संपादित करना उस कंप्यूटर पर वर्जित है (पृष्ठभूमि चलाने और लंबी-स्थायी प्रक्रियाएं नहीं होने पर)।

उत्तर

17

मेरे पसंदीदा तरीका है, और यकीनन सबसे आसान, screen उपयोग कर रहा है:

screen -d -m ./myProcess 
+1

है, तो आपको वास्तव में क्या चाहिए। मैं पहले ही भूल गया था कि मैंने कभी इस सवाल से पूछा है। स्क्रीन अब मेरी पसंद का टूल है :) –

+0

मुझे हाल ही में यह जीवन रक्षा उपकरण मिला। 'स्क्रीन' आपको कमांड में वापस जाने और सामान टाइप करने की अनुमति देता है। यह एसएसएच के साथ पूरी तरह से काम करता है। – Kayla

1

मुझे विश्वास है कि यह आपकी पर्ल स्क्रिप्ट के भीतर से काम करना चाहिए।

$SIG{ HUP } = 'IGNORE'; 

नोट nohup के लिए आदमी पेज दस्तावेज़ का कहना है:

इस, nohup SIGHUP संकेत सेट करने के लिए (3) (`` टर्मिनल लाइन hangup '') , तो ध्यान नहीं दिया जा करने के लिए किसी भी तर्क के साथ उपयोगिता निष्पादित करता है।

0

खोल से पृष्ठभूमि में नौकरी चलाना ठीक है, इस बात पर निर्भर करता है कि आप कितनी मैनुअल श्रम सुनिश्चित करना चाहते हैं कि यह लगातार चल रहा है।

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

स्क्रीन उपलब्ध होने पर भी एक विकल्प है।

crontab + स्क्रीन को जोड़ा जा सकता है।

+0

संपादन crontab उस कंप्यूटर पर मना किया है। –

+0

फिर आप यह सुनिश्चित नहीं कर सकते कि प्रक्रिया निरंतर चलती है (यानी रीबूट के बाद)। स्क्रीन और नोहप/SIGHUP को फँसाने अभी भी वैध तरीके हैं। – tommym

+0

सलाह का शब्द, उस मशीन पर किसी पृष्ठभूमि प्रक्रिया को डालने से पहले व्यवस्थापक से पूछें। यदि आपको क्रॉन्टाब की अनुमति नहीं है, तो व्यवस्थापक आपको पसंद नहीं कर सकता है। यदि आप अच्छी तरह से पूछते हैं तो शायद आपको अनुमति दी जाएगी :) – tommym

1

स्निपेट perldoc perlipc में है:

use POSIX 'setsid'; 

sub daemonize { 
    chdir '/'    or die "Can't chdir to /: $!"; 
    open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; 
    open STDOUT, '>/dev/null' 
          or die "Can't write to /dev/null: $!"; 
    defined(my $pid = fork) or die "Can't fork: $!"; 
    exit if $pid; 
    setsid     or die "Can't start a new session: $!"; 
    open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; 
} 

लेकिन मुझे यकीन है कि अगर आप रूट नहीं कर रहे हैं कि क्या setsid काम करेंगे नहीं हूँ। यदि नहीं, मानक हैंडल बंद करने के बाद डबल-कांटा की कोशिश करें।

कुछ लिंक: howto, daemonize

1
use Proc::Daemon; 
Proc::Daemon::Init; 

है यही कारण है कि मैं अपने सेंडमेल फिल्टर कार्यक्रम और शायद सबसे आसान तरीका जाने के लिए उपयोग करते हैं। मॉड्यूल सीपीएएन के माध्यम से उपलब्ध है।

+0

यदि वह डेमन :: जेनेरिक :: जबकि 1 का उपयोग नहीं कर सकता है क्योंकि वह इसे स्थापित नहीं कर सकता है, तो प्रो :: डेमॉन बेहतर क्यों काम करेगा? क्या यह पर्ल कोर मॉड्यूल सूची में है - यदि नहीं, तो इससे ज्यादा मदद नहीं मिलेगी। –

+0

मैं इसे स्थापित कर सकता हूं (मैंने रूट पासवर्ड के बिना काम करने के लिए सीपीएएन संशोधित किया है), लेकिन यह मुझे/var/run –

+0

हम्म में लिखने की क्षमता के बारे में कुछ बताता है ... मैंने स्रोत और मॉड्यूल को देखा, स्वयं प्रयास नहीं कर रहा है/var/run (कम से कम संस्करण का उपयोग कर रहा हूं) पर लिखने के लिए। यह एक बहुत छोटा मॉड्यूल है, इसलिए आप इसे देखना चाहते हैं और आपको आवश्यक न्यूनतम कोड के साथ एक और व्यक्तिगत संस्करण बनाना चाहते हैं। –

6

आप stdout बंद करने के लिए stderr, stdin की जरूरत है, अन्यथा आप अभी भी है कि विशिष्ट TTY

./my_script.pl >/dev/null 2>&1 </dev/null & 

यह करने के लिए बाध्य कर रहे हैं चाल करना चाहिए।

+0

सही! जब कोई स्क्रीन – b1r3k

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

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