রেডহ্যাটের অধীনে আমি কীভাবে শেল স্ক্রিপ্টটি ডেমন হিসাবে চালাতে পারি?


12

আমি একটি শেল স্ক্রিপ্ট পেয়েছি, যা মূলত কিছু লগিং সহ একটি লাইনার, যা আমি এটি একটি init স্ক্রিপ্ট থেকে চালানোর চেষ্টা করছি। আমি এটি চালানোর জন্য daemonভিতরে ফাংশনটি ব্যবহার করছি /etc/init.d/functions, কারণ রেহ্যাটের উপলব্ধ নেই start-stop-daemonavailable আমি যখন 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

আরআইডি স্ক্রিপ্ট:

#!/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

ব্যাশ -vx দিয়ে শেষ ~ 20 লাইন কার্যকর করা:

+ 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, আরপিএম প্যাকেজও রয়েছে । বিটিডব্লিউ, এখানে অনেক লগ নিরীক্ষণের সরঞ্জাম রয়েছে ( এখানে শুরু করুন )।
sr_

হাউক, আপনি কি প্রথম লাইনের ব্যবহার করছেন #!/bin/bash -vx? আমি এটি করার চেষ্টা করেছি, তবে এটি শর্ট স্ক্রিপ্টটি সরাসরি চালনা করলে এটি আরআর স্ক্রিপ্ট থেকে একই আউটপুট তৈরি করে না।
bshacklett

@babcklett আপনি যে কোনও init স্ক্রিপ্টের (যে কোনও শেল স্ক্রিপ্টের প্রকৃত পক্ষে) কার্যটি এটির সাথে স্পষ্টভাবে চালিয়ে পরীক্ষা করতে পারেন bash -vxbash -vx /etc/init.d/script start
sr_

1
@bshacklett Wrt লগ, আমি পুরো বিষয়টা বিস্তারিত বিবেচনা আছে চাই logstash । স্টোর লগ 4j থেকে সরাসরি লগ খাওয়ানো যায় তবে লগস্ট্যাশ এজেন্ট লগ ফাইলগুলিও নিরীক্ষণ করতে পারে
sr_

উত্তর:


2

আমি http://www.linuxforums.org/forum/programming-scriptting/190279-daemon-etc-init-d-function-does-not-return-launching-process.html#post897522 এ একটি স্ক্রিপ্ট পেয়েছি যা আমি সক্ষম হয়েছি আমার প্রয়োজন অনুসারে পরিবর্তন করতে। এটি ম্যানুয়ালি পিআইডি ট্র্যাক করে এবং ব্যবহার করে একটি পিআইডি ফাইল তৈরি করে pidof। আমি ব্যবহার করার জন্য এই সংশোধন করতে হচ্ছে শেষ পর্যন্ত pgrepহিসাবে pidofআমার স্ক্রিপ্ট PID, দেখতে অক্ষম ছিল। এই সংশোধনীর পরে, এটি দুর্দান্ত কাজ করেছে। * দ্রষ্টব্য, পুরো স্ক্রিপ্টের নাম 15 টি অক্ষরের নিচে থাকলে pgrep কেবলমাত্র কাজ করবে

আমি এখানে যা শেষ করেছি তা এখানে:

#!/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ফাংশন সংজ্ঞায়িত করে যা তার যুক্তিটি নিজেকে ডেমোনাইজ করার প্রত্যাশা করে, এটি কেবল ব্যবহারকারীকে পরিবর্তন করা, উলিমিটস সেট করা, পরীক্ষা করা (তৈরি করা নয়) একটি পিডফিলের মতো জিনিসগুলির যত্ন নেয় ... এই daemonফাংশনের সর্বোত্তম ব্যবহার হ'ল এটি লাইবস্ক্যাকেরdaemon সাথে প্রতিস্থাপন করা ;)
sr_

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