मेरे पास एक पर्ल स्क्रिप्ट है जिसे मैं डेमोनाइज़ करना चाहता हूं। मूल रूप से यह पर्ल स्क्रिप्ट हर 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 स्क्रिप्ट?
daemon
killproc