রেড হ্যাটে একটি পরিষেবা হিসাবে আমার একটি প্রোগ্রাম ইনস্টল করা দরকার। এটি নিজেই ব্যাকগ্রাউন্ড করে না, এর পিআইডি ফাইল পরিচালনা করে না বা নিজস্ব লগগুলি পরিচালনা করে না। এটি কেবল চালিত হয় এবং 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প্রোগ্রামটি দিয়ে এটি শুরু করি তখন টার্মিনালে প্রিন্ট করা হয় এবং কমান্ডটি সম্পন্ন হয় না। - যদি আমি সিটিআরএল-সি, এটি "অধিবেশন সমাপ্ত, শেল হত্যা ... ... নিহত। আমার শেল প্রম্পটটি আবার ফিরে পেতে আমাকে এটি করতে হবে।
- এখন যখন আমি
service someprog statusএটি চালায় এটি বলছে যে এটি চলছে এবং এর পিআইডি তালিকাবদ্ধ করে। আমি এটি দেখতে পাচ্ছিpsযাতে এটি চলছে। - এখন যখন আমি
service someprog stopএটি চালাতে ব্যর্থ হয়। আমি যাচাই করতে পারি যে এটি এখনও চলছেps।
someprogপটভূমিতে প্রেরণ এবং পরিষেবা হিসাবে পরিচালিত হওয়ার জন্য আমার কী পরিবর্তন করতে হবে ?
সম্পাদনা: আমি এখন সম্পর্কিত বেশ কয়েকটি প্রশ্নের সন্ধান পেয়েছি, এর মধ্যে একটিও "অন্য কিছু কর" ছাড়া সত্যিকারের উত্তর নেই:
- /Etc/init.d স্ক্রিপ্টে ডেমনকে কল করা ব্লক করা হচ্ছে, পটভূমিতে চলছে না
- সেন্টস-এ ডিমন হিসাবে চালানোর জন্য শেল স্ক্রিপ্ট পাচ্ছেন?
সম্পাদনা করুন: ডাবল ফোরিংয়ের এই উত্তরটি হয়ত আমার সমস্যার সমাধান করতে পারে, তবে এখন আমার প্রোগ্রামটি নিজেই ডাবল-ফর্কস এবং এটি কার্যকর: https://stackoverflow.com/a/9646251/898699