/Etc/init.d स्क्रिप्ट में डेमॉन पर कॉल करना अवरुद्ध है, पृष्ठभूमि में नहीं चल रहा है


9

मेरे पास एक पर्ल स्क्रिप्ट है जिसे मैं डेमोनाइज़ करना चाहता हूं। मूल रूप से यह पर्ल स्क्रिप्ट हर 30 सेकंड में एक डायरेक्टरी पढ़ेगी, उन फाइलों को पढ़ेगी जो इसे ढूंढती हैं और फिर डेटा प्रोसेस करती हैं। इसे सरल रखने के लिए यहां निम्नलिखित पर्ल स्क्रिप्ट पर विचार करें (जिसे synpipe_server कहा जाता है, इस स्क्रिप्ट का एक प्रतीकात्मक लिंक है /usr/sbin/):

#!/usr/bin/perl
use strict;
use warnings;

my $continue = 1;
$SIG{'TERM'}  = sub { $continue = 0; print "Caught TERM signal\n"; };
$SIG{'INT'} = sub { $continue = 0; print "Caught INT signal\n"; };

my $i = 0;
while ($continue) {
     #do stuff
     print "Hello, I am running " . ++$i . "\n";
     sleep 3;
}

इसलिए यह स्क्रिप्ट मूल रूप से हर 3 सेकंड में कुछ प्रिंट करती है।

फिर, जैसा कि मैं इस स्क्रिप्ट को डीमॉनेटाइज करना चाहता हूं, मैंने यह बैश स्क्रिप्ट भी डाल दी है (जिसे सिम्पाइप_सर्वर भी कहा जाता है) /etc/init.d/:

#!/bin/bash
# synpipe_server : This starts and stops synpipe_server
#
# chkconfig: 12345 12 88
# description: Monitors all production pipelines
# processname: synpipe_server
# pidfile: /var/run/synpipe_server.pid
# Source function library.
. /etc/rc.d/init.d/functions

pname="synpipe_server"
exe="/usr/sbin/synpipe_server"
pidfile="/var/run/${pname}.pid"
lockfile="/var/lock/subsys/${pname}"

[ -x $exe ] || exit 0

RETVAL=0

start() {
    echo -n "Starting $pname : "
    daemon ${exe}
    RETVAL=$?
    PID=$!
    echo
    [ $RETVAL -eq 0 ] && touch ${lockfile}
    echo $PID > ${pidfile}
}

stop() {
    echo -n "Shutting down $pname : "
    killproc ${exe}
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        rm -f ${lockfile}
        rm -f ${pidfile}
    fi
}

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

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

exit 0

इसलिए, (अगर मैं अच्छी तरह से डेमॉन के लिए डॉक्टर को समझ गया हूं) तो पर्ल स्क्रिप्ट को पृष्ठभूमि में चलना चाहिए और /dev/nullयदि मैं निष्पादित करता हूं तो आउटपुट को रीडायरेक्ट किया जाना चाहिए :

service synpipe_server start

लेकिन यहाँ मैं इसके बजाय क्या है:

[root@master init.d]# service synpipe_server start
Starting synpipe_server : Hello, I am running 1
Hello, I am running 2
Hello, I am running 3
Hello, I am running 4
Caught INT signal
                                                           [  OK  ]
[root@master init.d]# 

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

क्या किसी को इस बात का अंदाजा नहीं है कि मैं क्या गलत कर रहा हूं?

संपादित करें: शायद मुझे कहना चाहिए कि मैं एक Red Hat मशीन पर हूं।

Scientific Linux SL release 5.4 (Boron)

क्या यह काम करेगा यदि डेमन फ़ंक्शन का उपयोग करने के बजाय, मैं कुछ का उपयोग करता हूं:

nohup ${exe} >/dev/null 2>&1 &

init स्क्रिप्ट?

जवाबों:


4

मेरा सुझाव है कि आप redhat init स्क्रिप्ट daemonफ़ंक्शन की अतिरिक्त परत को जोड़ने के बजाय सीधे पर्ल स्क्रिप्ट का उपयोग करें। यदि आप उन्हें अपने दम पर लिखने का प्रयास करते हैं, तो डेमॉन को प्राप्त करना कठिन है। Proc :: Daemon बहुत सीधा है।

इसके अलावा, यहाँ कैसे पर्ल डेमॉन लिखने के लिए की एक चर्चा है ।

बोनस उत्तर: डेमोनटूल और प्रोक का उपयोग करें :: डेमोनटूल । यह एक व्यापक डेमन प्रबंधन प्रणाली प्रदान करता है और आप शायद पहले से ही डेमोनटूल वैसे भी स्थापित कर चुके हैं। कुछ लोग डेमोंटोल्स को नापसंद करते हैं लेकिन यह काम पूरा कर देता है।

कोई फर्क नहीं पड़ता कि मैं कितनी बार डेमन लिखता हूं अभी भी अजीब लगता है। शायद मैं सिर्फ dmon का उपयोग करना चाहिए।


2

यदि आप डेबियन और उसके डेरिवेटिव का उपयोग कर रहे हैं, तो start-stop-daemonसमस्या के बिना अपनी प्रक्रिया शुरू करने के लिए -b विकल्प का उपयोग करें।


यह daemonkillproc
रेडहैट

1
इससे आज मेरी समस्या हल हो गई। उबंटू में, मैंने /etc/init.d/skeleton को कॉपी किया और यह पता नहीं लगा सका कि यह पृष्ठभूमि में क्यों नहीं चल रहा था। मुझे लगता है कि यह पहले से ही पृष्ठभूमि के लिए स्थापित किया गया था, लेकिन पता चलता है कि यह नहीं है।
रयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.