मैं रेडहैट के तहत एक शेल स्क्रिप्ट को डेमॉन के रूप में कैसे चला सकता हूं?


12

मुझे एक शेल स्क्रिप्ट मिली है, जो अनिवार्य रूप से कुछ लॉगिंग के साथ एक लाइनर है, जिसे मैं एक init स्क्रिप्ट से चलाने की कोशिश कर रहा हूं। मैं इसे चलाने daemonके /etc/init.d/functionsलिए अंदर फ़ंक्शन का उपयोग कर रहा हूं , क्योंकि Redhat start-stop-daemonउपलब्ध नहीं है। जब मैं init स्क्रिप्ट को कॉल करता हूं ( /etc/init.d/script start) यह अग्रभूमि में रहता है, बजाय चलने की प्रक्रिया को पूरा करने और छोड़ने के। मेरे लिए इस लिपि को निष्क्रिय करने का उचित तरीका क्या है?

चलाने के लिए स्क्रिप्ट:

# conf file where variables are defined
. /etc/script.conf

echo "Starting..." | logger -i
echo "Monitoring $LOG_LOCATION." | logger -i
echo "Sending to $MONITOR_HOST:$MONITOR_PORT." | logger -i

tail -n 1 -F $LOG_LOCATION |
grep WARN --line-buffered  |
/usr/bin/nc -vv $MONITOR_HOST $MONITOR_PORT 2>&1 |
logger -i

init स्क्रिप्ट:

#!/bin/bash


# Source Defaults
. /etc/default/script

# Source init functions
. /etc/init.d/functions

prog=/usr/local/bin/script.sh

[ -f /etc/script.conf ] || exit 1

RETVAL=0

start()
{
    # Quit if disabled
    if ! $ENABLED; then
            echo "Service Disabled in /etc/default/script"
            exit 1
    fi

    echo "Starting $prog"

    daemon $prog

    RETVAL=$?

    return $RETVAL
}

stop ()
{
    echo -n $"Stopping $prog: "
    killproc $prog

    RETVAL=$?

    return $RETVAL
}

reload()
{
    echo "Reload command is not implemented for this service."
    return $RETVAL
}

restart()
{
    stop
    start
}

condrestart()
{
    echo "Not Implemented."
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status $prog
        ;;
    restart)
        restart
        ;;
    reload)
        reload
        ;;
    condrestart)
        condrestart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
        RETVAL=1
esac

बैश के साथ निष्पादन की अंतिम ~ 20 पंक्तियाँ -vx:

+ case "$1" in
+ start
+ true
+ echo 'Starting /usr/local/bin/script.sh'
Starting /usr/local/bin/script.sh
+ daemon /usr/local/bin/script.sh
+ local gotbase= force=
+ local base= user= nice= bg= pid=
+ nicelevel=0
+ '[' /usr/local/bin/script.sh '!=' /usr/local/bin/script.sh ']'
+ '[' -z '' ']'
+ base=script.sh
+ '[' -f /var/run/script.sh.pid ']'
+ '[' -n '' -a -z '' ']'
+ ulimit -S -c 0
+ '[' -n '' ']'
+ '[' color = verbose -a -z '' ']'
+ '[' -z '' ']'
+ initlog -q -c /usr/local/bin/script.sh

यह मेरे लिए उपयोगी लगता है कि आप उस स्क्रिप्ट bash -vx ...को अंतिम पंक्तियों के माध्यम से चलाते हैं ताकि हम यह देख सकें कि अग्रभूमि में क्या रहता है।
हौके लैगिंग

1
इस अधिकार का उपयोग हो रही परेशान और साथ मत जाओ daemon, वहाँ एक RPM पैकेज भी। Btw, वहाँ कई लॉग मॉनिटरिंग उपकरण हैं ( यहाँ शुरू करें )।
sr_

Hauke, क्या आप पहली पंक्ति का उपयोग करने का मतलब है #!/bin/bash -vx? मैंने ऐसा करने की कोशिश की, लेकिन यह init स्क्रिप्ट से उतने आउटपुट का उत्पादन नहीं किया जितना कि अगर मैं सीधे शेल स्क्रिप्ट को चलाता हूं।
bshacklett

@bshaletlet आप किसी भी init script (किसी भी शेल स्क्रिप्ट का वास्तव में) फ़ंक्शन को स्पष्ट रूप से bash -vx, यानी के साथ चलाकर जांच सकते हैं । bash -vx /etc/init.d/script start
sr_

1
@bshacklett राइट लॉग्स, मुझे लॉगस्टैश पर करीब से देखना होगा । स्टोर को लॉग 4 जे से सीधे लॉग्स खिलाया जा सकता है, लेकिन लॉगस्टैश एजेंट लॉग फाइलों की निगरानी भी कर सकता है
sr_

जवाबों:


2

मुझे http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-proct.html#post897522 पर एक स्क्रिप्ट मिली जिसे मैं सक्षम था मेरी आवश्यकताओं के अनुरूप संशोधित करने के लिए। यह मैन्युअल रूप से PID को ट्रैक करता है और एक PID फ़ाइल का उपयोग करके बनाता है pidof। मैं उपयोग करने के लिए इस संशोधित करने के लिए होने समाप्त हो गया pgrepके रूप में pidofमेरी स्क्रिप्ट की पीआईडी को देखने में असमर्थ था। उस संशोधन के बाद, यह ठीक काम किया। * ध्यान दें, pgrep केवल तभी काम करता है जब पूर्ण स्क्रिप्ट नाम 15 वर्णों से कम लंबा हो

यहाँ मैंने क्या किया:

#!/bin/bash
#
# 
#
# Start on runlevels 3, 4 and 5. Start late, kill early.
# chkconfig: 345 95 05
#
#
#!/bin/bash

# absolute path to executable binary
progpath='/usr/local/bin/script.sh'

# arguments to script
opts=''

# binary program name
prog=$(basename $progpath)

# pid file
pidfile="/var/run/${prog}.pid"

# make sure full path to executable binary is found
! [ -x $progpath ] && echo "$progpath: executable not found" && exit 1

eval_cmd() {
  local rc=$1
  if [ $rc -eq 0 ]; then
    echo '[  OK  ]'
  else
    echo '[FAILED]'
  fi
  return $rc
}

start() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -n "$pids" ]; then
    echo "$prog (pid $pids) is already running"
    return 0
  fi
  printf "%-50s%s" "Starting $prog: " ''
  $progpath $opts &

  # save pid to file if you want
  echo $! > $pidfile

  # check again if running
  pgrep $prog >/dev/null 2>&1
  eval_cmd $?
}

stop() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -z "$pids" ]; then
    echo "$prog not running"
    return 0
  fi
  printf "%-50s%s" "Stopping $prog: " ''
  rm -f $pidfile
  kill -9 $pids
  eval_cmd $?
}

status() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -n "$pids" ]; then
    echo "$prog (pid $pids) is running"
  else
    echo "$prog is stopped"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    sleep 1
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit $?

0

मैं रेडहैट को नहीं जानता लेकिन daemon $prog &मुझे अजीब लगता है। यदि पहले से ही इस कार्य को करने के लिए एक समारोह है, तो इस फ़ंक्शन को पृष्ठभूमि में रखना आवश्यक (और उपयोगी) क्यों होना चाहिए? इस प्रकार के बिना प्रयास करें &


4
यह गलत नहीं है। /etc/init.d/functionsएक daemonफ़ंक्शन को परिभाषित करता है जो अपने तर्क को खुद को नीचा दिखाने की उम्मीद करता है, यह केवल उपयोगकर्ता को बदलने, ulimits सेट करने, जाँचने (नहीं बनाने!) को एक पाइडफाइल जैसी चीजों का ख्याल रखता है ... इस daemonफ़ंक्शन का सबसे अच्छा उपयोग इसे libsackack केdaemon साथ बदलने के लिए है ;)
sr_

मुझे खेद है, और जब मैं समस्या निवारण कर रहा था तो एक बिंदु पर था। मुझे इस पोस्ट में शामिल करने का मतलब नहीं था।
bshacklett
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.