मेरे पास एक पर्ल स्क्रिप्ट है जिसे मैं डिमन करना चाहता हूं। असल में यह perl स्क्रिप्ट प्रत्येक 30 सेकंड में एक निर्देशिका पढ़ेगी, जो फाइलें पाती हैं उन्हें पढ़ें और फिर डेटा को संसाधित करें।एक /etc/init.d स्क्रिप्ट में डेमॉन पर कॉल अवरुद्ध है, पृष्ठभूमि में नहीं चल रहा है
#!/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 सेकंड प्रिंट: यह सरल यहाँ निम्नलिखित पर्ल स्क्रिप्ट पर विचार रखने के लिए (synpipe_server कहा जाता है, वहाँ /usr/sbin/
में इस स्क्रिप्ट का एक प्रतीकात्मक कड़ी है)।
फिर, के रूप में मैं इस स्क्रिप्ट daemonize करना चाहते हैं, मैं भी इस पार्टी स्क्रिप्ट (भी बुलाया synpipe_server) /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
लेकिन यहाँ मैं क्या बजाय मिलता है:
[[email protected] 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 ]
[[email protected] init.d]#
तो यह पर्ल स्क्रिप्ट शुरू करता है लेकिन इसे मौजूदा टर्मिनल सत्र से अलग किए बिना चलाता है, और मैं अपने कंसोल में मुद्रित आउटपुट देख सकता हूं ... जो वास्तव में मैं उम्मीद नहीं कर रहा था। इसके अलावा, पीआईडी फ़ाइल खाली है (या केवल लाइन फीड के साथ, डेमॉन द्वारा कोई भी पिड वापस नहीं किया गया है)।
क्या किसी को भी कोई विचार है कि मैं क्या गलत कर रहा हूं?
संपादित करें: शायद मुझे यह कहना चाहिए कि मैं एक Red Hat मशीन पर हूं।
Scientific Linux SL release 5.4 (Boron)
धन्यवाद, टोनी
के बजाय परिवर्तन के लिए मतदान करने के लिए एक डेमॉन लेखन, आप http://en.wikipedia.org/wiki/Inotify inotify इस्तेमाल कर सकते हैं आपको सूचित करना है जब एक परिवर्तन हुआ है। कोड के लिए कोड करना अधिक आसान है, और अधिक तेज़ अपडेट देख सकते हैं। इसके साथ बात करने के लिए कई सीपीएएन मॉड्यूल हैं। http://search.cpan.org/search?query=inotify&mode=all – Schwern
धन्यवाद, यह उपयोगी जानकारी है, मैं निश्चित रूप से इनोटिफी पर एक नज़र डालेगा। – tony
@Schwern: यह इस तथ्य को नहीं बदलेगा कि पृष्ठभूमि में एक डिमन चलाने के लिए मुझे अधिसूचना अधिसूचनाओं की प्रतीक्षा करनी है, नहीं ?? – tony