ইনি স্ক্রিপ্ট থেকে ডেমন হিসাবে স্বেচ্ছাসেবী প্রোগ্রাম চালানো


10

রেড হ্যাটে একটি পরিষেবা হিসাবে আমার একটি প্রোগ্রাম ইনস্টল করা দরকার। এটি নিজেই ব্যাকগ্রাউন্ড করে না, এর পিআইডি ফাইল পরিচালনা করে না বা নিজস্ব লগগুলি পরিচালনা করে না। এটি কেবল চালিত হয় এবং 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পটভূমিতে প্রেরণ এবং পরিষেবা হিসাবে পরিচালিত হওয়ার জন্য আমার কী পরিবর্তন করতে হবে ?

সম্পাদনা: আমি এখন সম্পর্কিত বেশ কয়েকটি প্রশ্নের সন্ধান পেয়েছি, এর মধ্যে একটিও "অন্য কিছু কর" ছাড়া সত্যিকারের উত্তর নেই:

সম্পাদনা করুন: ডাবল ফোরিংয়ের এই উত্তরটি হয়ত আমার সমস্যার সমাধান করতে পারে, তবে এখন আমার প্রোগ্রামটি নিজেই ডাবল-ফর্কস এবং এটি কার্যকর: https://stackoverflow.com/a/9646251/898699


আপনি কি লাইবস্ক্যাকের দ্বারা সরবরাহিত "ডেমন" ইউটিলিটি দিয়ে প্রোগ্রামটি শুরু করছেন? libslack.org/daemon/#docamentation এই ক্ষেত্রে প্রোগ্রামটি ডেমন-নাম --stop হিসাবে বন্ধ করা যেতে পারে can এছাড়াও, আউটপুট (প্রোগ্রাম শুরু করার সময়) কোনও ফাইলে বা / dev / নাল থেকে পুনর্নির্দেশ করার চেষ্টা করুন এবং চেক করুন।
অঙ্কিত

2
আপনার রেডহ্যাটের সংস্করণ নির্ভর, আপনি কেবল এটির জন্য একটি সাধারণ মোড়ক তৈরি করতে পারেন এবং সরাসরি এটি আপস্টার্টে কল করতে পারেন। তারপরে আপস্টার্ট আপনার জন্য পরিষেবাটি পরিচালনা করবে। যদিও এটি একটি EL6 জিনিস।
ম্যাথু আইফে

উত্তর:


1

কমান্ডটি "সম্পূর্ণ হয় না" কারণ daemonফাংশনটি আপনার জন্য পটভূমিতে আপনার অ্যাপ্লিকেশনটি চালায় না। &আপনার daemonকমান্ডের শেষে আপনাকে এর মতো একটি যুক্ত করতে হবে :

daemon --user someproguser $exec &

যদি someprogহ্যান্ডেল না করে SIGHUPতবে আপনার কমান্ডটি nohupনিশ্চিত করা উচিত যাতে আপনার প্রক্রিয়াটি গ্রহণ না করে SIGHUPযা প্যারেন্ট শেলটি প্রস্থান করার সময় আপনার প্রক্রিয়াটি প্রস্থান করতে বলে। এটি দেখতে এই রকম হবে:

daemon --user someproguser "nohup $exec" &

আপনার stopফাংশনে, killproc "exec"আপনার প্রোগ্রামটি থামানোর জন্য কিছু করছে না। এটি যেমন পড়া উচিত:

killproc $exec

killprocআপনার অ্যাপ্লিকেশনটির পুরো পথটি এটি সঠিকভাবে বন্ধ করার জন্য প্রয়োজন। killprocঅতীতে আমার কিছুটা সমস্যা হয়েছিল, তাই আপনি কেবল পিআইডিএফআইএলটিকে পিআইডি মেরে ফেলতে পারেন আপনার এমন পিআইডি লিখতে হবে someprogযাতে এরকম কিছু দিয়ে:

cat $pidfile | xargs kill

আপনি পিআইডিএফআইএল এভাবে লিখতে পারেন:

ps aux | grep $exec | grep -v grep | tr -s " " | cut -d " " -f2 > $pidfile

যেখানে $pidfileপয়েন্ট /var/run/someprog.pid

আপনি যদি আপনার stopফাংশনে [ওকে] বা [ফেইলড] চান তবে আপনার কাছ থেকে এর successএবং failureফাংশনগুলি ব্যবহার করা উচিত /etc/rc.d/init.d/functionsstartফাংশনে আপনার এগুলির দরকার নেই কারণ আপনার জন্য daemonউপযুক্তটিকে কল করে।

আপনার কেবল খালি জায়গাগুলির সাথে স্ট্রিংগুলির চারপাশে উদ্ধৃতিগুলির প্রয়োজন। এটি একটি স্টাইল পছন্দ, যদিও এটি আপনার উপর নির্ভর করে।

এই সমস্ত পরিবর্তনগুলি এর মতো দেখাচ্ছে:

#!/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
pidfile=/var/run/$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 "nohup $exec" &
        RETVAL=$?
        if [ $RETVAL -eq 0 ]; then
          touch $lockfile
          ps aux | grep $exec | grep -v grep | tr -s " " | cut -d " " -f2 > $pidfile
        fi
        echo
    fi
    return $RETVAL
}

stop() {
    check
    echo -n $"Stopping $prog: "
    killproc $exec && cat $pidfile | kill
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
      rm -f $lockfile
      rm -f $pidfile
      success; echo
    else
      failure; echo
    fi
    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

দুঃখিত, আপনাকে সঠিক উত্তর পেতে প্রায় 4.5 বছর সময় নিয়েছে 4.5
স্টুপুরম্যান

-1

এটি যদি আপনার প্রোগ্রাম হয় তবে দয়া করে এটি একটি যথাযথ ডেমন হিসাবে লিখুন। বিশেষত যদি এটি পুনরায় বিতরণের জন্য। :)

আপনি মনিট চেষ্টা করতে পারেন । অথবা রুনিট বা ডেমোনটোলগুলির মতো কিছু। যারা শক্তিশালী তাদের সহজে প্যাকেজ উপলব্ধ নেই। ডিমনবোলগুলি ডিজেবি থেকে আসে, যদি তা আপনার সিদ্ধান্তকে প্রভাবিত করে (উভয় দিকেই।)


-1

আমি আরও কিছু গবেষণা করেছি এবং দেখা যাচ্ছে যে উত্তরটি "আপনি এটি করতে পারবেন না"। পরিচালিত প্রোগ্রামটি অবশ্যই নিজেকে সঠিকভাবে ডেমোনাইজ করতে হবে: এর স্ট্যান্ডার্ড ফাইলহ্যান্ডলগুলি কাঁটাচামচ করা এবং বিচ্ছিন্ন করা, টার্মিনাল থেকে বিচ্ছিন্ন করা এবং একটি নতুন সেশন শুরু করা।

সম্পাদনা: আপাতদৃষ্টিতে আমি ভুল - ডাবল ফোরিং কাজ করবে। https://stackoverflow.com/a/9646251/898699


আপনি মন্তব্যগুলিতে উল্লিখিত হিসাবে আপস্টার্ট ব্যবহার করে এটি করতে পারেন।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.