2009-04-19 13 views
55

लिनक्स में डिमन के रूप में चलाने के लिए पर्ल स्क्रिप्ट प्राप्त करने का एक आसान तरीका क्या है?मैं लिनक्स में सिस्टम डिमन के रूप में एक पर्ल स्क्रिप्ट कैसे चला सकता हूं?

वर्तमान में, यह CentOS पर है। मैं चाहता हूं कि यह सिस्टम के साथ शुरू हो और सिस्टम के साथ बंद हो जाए, इसलिए कुछ /etc/rc.d/init.d एकीकरण भी अच्छा होगा, लेकिन मैं हमेशा /etc/rc.d/rc.local पर कस्टम लाइन जोड़ सकता हूं।

उत्तर

81

सबसे आसान तरीका Proc::Daemon का उपयोग करना है।

#!/usr/bin/perl 

use strict; 
use warnings; 
use Proc::Daemon; 

Proc::Daemon::Init; 

my $continue = 1; 
$SIG{TERM} = sub { $continue = 0 }; 

while ($continue) { 
    #do stuff 
} 

वैकल्पिक रूप से आप चीजों को प्रोक :: Daemon करता है के सभी कर सकता है:

  1. कांटा एक बच्चे और माता पिता प्रक्रिया बाहर निकालता है।
  2. एक सत्र नेता बनें (जो नियंत्रण टर्मिनल से प्रोग्राम को अलग करता है)।
  3. फोर्क एक और बच्चे की प्रक्रिया और पहले बच्चे से बाहर निकलें। यह एक नियंत्रण टर्मिनल प्राप्त करने की क्षमता को रोकता है।
  4. वर्तमान कार्य निर्देशिका को "/" पर बदलें।
  5. फ़ाइल निर्माण मास्क साफ़ करें।
  6. सभी खुले फ़ाइल डिस्क्रिप्टर बंद करें।

रनलेवल सिस्टम के साथ एकीकृत करना आसान है। आपको निम्न की तरह एक स्क्रिप्ट चाहिए (को पर्ल स्क्रिप्ट के नाम, YYYYYYYYYYYYYYYYYYY के साथ इसके विवरण के साथ, और /path/to पर्ल स्क्रिप्ट के पथ के साथ प्रतिस्थापित करें) /etc/init.d में बदलें। चूंकि आप CentOS का उपयोग कर रहे हैं, एक बार जब आपके पास /etc/init.d में स्क्रिप्ट है, तो आप इसे chkconfig का उपयोग इसे बंद करने या विभिन्न रनलेवल में चालू करने के लिए कर सकते हैं।

#!/bin/bash 
# 
# XXXXXXXXXXXX This starts and stops XXXXXXXXXXXX 
# 
# chkconfig: 2345 12 88 
# description: XXXXXXXXXXXX is YYYYYYYYYYYYYYYYYYY 
# processname: XXXXXXXXXXXX 
# pidfile: /var/run/XXXXXXXXXXXX.pid 
### BEGIN INIT INFO 
# Provides: $XXXXXXXXXXXX 
### END INIT INFO 

# Source function library. 
. /etc/init.d/functions 

binary="/path/to/XXXXXXXXXXXX" 

[ -x $binary ] || exit 0 

RETVAL=0 

start() { 
    echo -n "Starting XXXXXXXXXXXX: " 
    daemon $binary 
    RETVAL=$? 
    PID=$! 
    echo 
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/XXXXXXXXXXXX 

    echo $PID > /var/run/XXXXXXXXXXXX.pid 
} 

stop() { 
    echo -n "Shutting down XXXXXXXXXXXX: " 
    killproc XXXXXXXXXXXX 
    RETVAL=$? 
    echo 
    if [ $RETVAL -eq 0 ]; then 
     rm -f /var/lock/subsys/XXXXXXXXXXXX 
     rm -f /var/run/XXXXXXXXXXXX.pid 
    fi 
} 

restart() { 
    echo -n "Restarting XXXXXXXXXXXX: " 
    stop 
    sleep 2 
    start 
} 

case "$1" in 
    start) 
     start 
    ;; 
    stop) 
     stop 
    ;; 
    status) 
     status XXXXXXXXXXXX 
    ;; 
    restart) 
     restart 
    ;; 
    *) 
     echo "Usage: $0 {start|stop|status|restart}" 
    ;; 
esac 

exit 0 
+0

मुझे सेवा एक्स chkconfig का समर्थन नहीं करता है। जब chkconfig -add एक्स चलाते हैं तो कोई सुझाव? – Jirapong

+0

आह, माफ करना मेरी गलती है। # डिस्क्रिप्शन पर टाइपो। बहुत धन्यवाद! – Jirapong

+0

ग्रेट फीडबैक, बड़ा धन्यवाद! –

7

मुझे लगता है कि daemon का उपयोग करना सबसे आसान तरीका है। यह आपको किसी भी प्रक्रिया को डिमन के रूप में चलाने की अनुमति देता है। इसका मतलब है कि आपको पुस्तकालयों के बारे में चिंता करने की ज़रूरत नहीं है, उदाहरण के लिए, आपने पाइथन में बदलने का फैसला किया है। इसका उपयोग करने के लिए, बस उपयोग करें:

daemon myscript args 

यह अधिकांश distros पर उपलब्ध होना चाहिए, लेकिन यह डिफ़ॉल्ट रूप से स्थापित नहीं किया जा सकता है।

+0

यह एक अच्छा विचार है, लेकिन मुझे पता है कि कुछ उत्पादन वातावरण में डेमॉन बाइनरी तक पहुंच नहीं है। व्यक्तिगत रूप से मैं एक एंटरप्राइज़ उत्पादन वातावरण में उपयोग करने के लिए एक परीक्षण/विकास मंच के बारे में अधिक देखता हूं। अच्छी जानकारी हालांकि - मैंने इससे पहले नहीं सुना होगा। (संपादित करें: पता नहीं था कि धागा 5 साल का था, लेकिन अभी भी प्रासंगिक आईएमओ) –

36

यदि आपके पास चास द्वारा सुझाए गए अनुसार Proc::Daemon नहीं है। ओवेन्स, यहां आप इसे हाथ से कैसे करेंगे:

sub daemonize { 
    use POSIX; 
    POSIX::setsid or die "setsid: $!"; 
    my $pid = fork() // die $!; #// 
    exit(0) if $pid; 

    chdir "/"; 
    umask 0; 
    for (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024)) 
     { POSIX::close $_ } 
    open (STDIN, "</dev/null"); 
    open (STDOUT, ">/dev/null"); 
    open (STDERR, ">&STDOUT"); 
} 
+1

मैं कहूंगा कि प्रो :: डेमॉन को हाथ से रोल करने से परेशान करने के लिए बस इतना आसान है, लेकिन यह हमेशा अच्छा है कि TMTOWTDI:) –

+0

दरअसल कि पिछले एक की तुलना में मेरे लिए बेहतर काम किया। मेरे पास प्रत्येक इनपुट आउटपुट पर नियंत्रण है। मान लीजिए कि आप इसे प्रो :: डेमन में भी पा सकते हैं! –

+7

गैर-कोर मॉड्यूल की आवश्यकता नहीं होने के लिए उपरोक्त, जो कभी-कभी मायने रखता है। –