मुझे Red Hat में सेवा के रूप में एक प्रोग्राम स्थापित करने की आवश्यकता है। यह खुद को बैकग्राउंड नहीं करता है, इसकी PID फाइल को प्रबंधित करता है, या अपने लॉग का प्रबंधन करता है। यह सिर्फ STDOUT और STDERR को चलाता है और प्रिंट करता है।
गाइड के रूप में मानक init स्क्रिप्ट का उपयोग करना, मैंने निम्नलिखित विकसित किया है:
#!/bin/bash
#
# /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf
# Source function library.
. /etc/rc.d/init.d/functions
prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0
check() {
[ `id -u` = 0 ] || exit 4
test -x "$exec" || exit 5
}
start() {
check
if [ ! -f "$lockfile" ]; then
echo -n $"Starting $prog: "
daemon --user someproguser "$exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$lockfile"
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping $prog: "
killproc "exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$lockfile"
echo
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status "$prog"
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
यह हो सकता है कि मेरी गलती /etc/init.d में मौजूद कुछ स्क्रिप्ट को कॉपी-पेस्ट और संशोधित करने की थी। किसी भी मामले में, परिणामी सेवा अजीब व्यवहार करती है:
- जब मैं इसे
service someprog start
टर्मिनल के लिए प्रोग्राम प्रिंट के साथ शुरू करता हूं और कमांड पूरा नहीं होता है। - यदि मैं CTRL-C करता हूं, तो यह "सत्र समाप्त हो जाता है, शेल को मारता है ... मारा जाता है। विफल"। मुझे अपना शेल फिर से वापस पाने के लिए ऐसा करना होगा।
- अब जब मैं
service someprog status
इसे चलाता हूं तो यह कहता है कि यह चल रहा है और इसकी पीआईडी को सूचीबद्ध करता है। मैं इसे देख सकता हूंps
इसलिए यह चल रहा है। - अब जब मैं दौड़ता हूं तो
service someprog stop
यह रुकने में विफल रहता है। मैं सत्यापित कर सकता हूं कि यह अभी भी साथ चल रहा हैps
।
मुझे क्या बदलने की आवश्यकता है ताकि someprog
पृष्ठभूमि पर भेजा जाए और एक सेवा के रूप में प्रबंधित किया जाए?
संपादित करें: मुझे अब संबंधित प्रश्नों के एक जोड़े का पता चला है, दोनों में से कोई भी वास्तविक उत्तर के अलावा "कुछ और न करें":
- /Etc/init.d स्क्रिप्ट में डेमॉन पर कॉल करना अवरुद्ध है, पृष्ठभूमि में नहीं चल रहा है
- CentOS पर एक डेमन के रूप में चलाने के लिए शेल स्क्रिप्ट प्राप्त करना?
संपादित करें: डबल-फोर्किंग के इस जवाब से मेरी समस्या हल हो गई होगी, लेकिन अब मेरा प्रोग्राम खुद डबल-फोर्क्स और वह काम करता है: https://stackoverflow.com/a/9646251/898699