Làm cách nào tôi có thể chạy tập lệnh shell dưới dạng daemon dưới Redhat?


12

Tôi đã có một tập lệnh shell, về cơ bản là một tập lệnh với một số bản ghi, tôi đang cố gắng chạy tập lệnh này từ tập lệnh init. Tôi đang sử dụng daemonchức năng bên trong /etc/init.d/functionsđể chạy nó, vì Redhat dường như không có start-stop-daemonsẵn. Khi tôi gọi init script ( /etc/init.d/script start) nó sẽ ở phía trước, thay vì hoàn thành và để quá trình chạy. Cách thích hợp để tôi có được kịch bản này là gì?

Kịch bản được chạy:

# 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

tập lệnh 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 dòng thực hiện cuối cùng với bash -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

Nó có vẻ hữu ích với tôi rằng bạn chạy đoạn script đó qua bash -vx ...và đăng những dòng cuối cùng để chúng ta có thể thấy những gì ở phía trước.
Hauke ​​Laging

1
Đừng bận tâm đến việc sử dụng quyền này và đi cùng daemon, cũng có gói RPM . Btw, có nhiều công cụ giám sát nhật ký ngoài kia ( bắt đầu từ đây ).
sr_

Hauke, bạn có nghĩa là sử dụng một dòng đầu tiên #!/bin/bash -vx? Tôi đã thử làm điều này, nhưng nó không tạo ra cùng một đầu ra từ tập lệnh init giống như khi tôi chạy trực tiếp tập lệnh shell.
bshacklett

@bshacklett bạn có thể kiểm tra bất kỳ hàm init script nào (thực sự là bất kỳ script shell nào) bằng cách chạy nó một cách rõ ràng với bash -vx, tức là. bash -vx /etc/init.d/script start.
sr_

1
@bshacklett Nhật ký Wrt, tôi sẽ xem xét kỹ hơn về logstash . Cửa hàng có thể được cung cấp nhật ký trực tiếp từ Log4j, nhưng tác nhân logstash cũng có thể theo dõi các tệp nhật ký
sr_

Câu trả lời:


2

Tôi đã tìm thấy một tập lệnh tại http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-fifts-does-not-return-launching- Process.html # post897522 mà tôi đã có thể để sửa đổi cho phù hợp với nhu cầu của tôi. Nó theo dõi thủ công PID và tạo một tệp PID bằng cách sử dụng pidof. Cuối cùng tôi đã phải sửa đổi điều này để sử dụng pgreppidofkhông thể thấy PID của tập lệnh của mình. Sau khi sửa đổi, nó hoạt động tốt. * Lưu ý, pgrep dường như chỉ hoạt động nếu tên tập lệnh đầy đủ dài dưới 15 ký tự

Đây là những gì tôi đã kết thúc với:

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

Tôi không biết Redhat nhưng có daemon $prog &vẻ lạ đối với tôi. Nếu đã có một chức năng để tạo daemon thì tại sao nó lại cần thiết (và hữu ích) để đặt chính chức năng này trong nền? Do đó, cố gắng mà không có &.


4
Điều đó không sai. /etc/init.d/functionsđịnh nghĩa một daemonhàm dự kiến ​​đối số của nó sẽ tự kích hoạt nó, nó chỉ quan tâm đến những thứ như thay đổi người dùng, đặt các mối quan hệ, kiểm tra (không tạo!) một pidfile ... Cách sử dụng tốt nhất của daemonhàm này là thay thế nó bằng libslackdaemon ;)
sr_

Tôi xin lỗi, & đã có mặt tại một thời điểm khi tôi đang khắc phục sự cố. Tôi không có ý đưa nó vào bài viết này.
bshacklett
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.