Cách gỡ lỗi tập lệnh init.d không được chạy


7

Tôi đang cố gắng để godbắt đầu trong khi khởi động trên Debian. Tôi đã thêm một tập lệnh vào /etc/init.d/thư mục trông như thế này.

#!/usr/bin/sh
### BEGIN INIT INFO
# Provides:          god
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog 
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: start god process monitoring
# Description:       Start god process monitoring
### END INIT INFO

god_conf="absolute/path/to/god.conf"
god_pid_file="/var/run/god/god.pid" ; mkdir -p `dirname $god_pid_file`
god_log_file="/var/log/god/god.log" ; mkdir -p `dirname $god_log_file`
case "$1" in
  start)
    god -c "$god_conf" -P "$god_pid_file" -l "$god_log_file"
    RETVAL=$?
    echo "God started"
    ;;
...

Tôi đã chạy lệnh sau để tạo các liên kết tượng trưng cần thiết sudo update-rc.d god defaults

Tuy nhiên, khi tôi khởi động lại máy, thần dường như không bắt đầu. Câu hỏi của tôi là, làm thế nào tôi có thể gỡ lỗi vấn đề này?

Tôi đã xem dmesgvà không thấy bất cứ điều gì liên quan đến god. Tôi cũng đã xem syslogvà không thấy gì ở đó. Ngoài ra, god.logtập tin trống và không có god.pidtập tin.

Tôi không biết vấn đề là tập lệnh init của tôi thậm chí không được gọi hay nếu nó bị lỗi khi nó cố gắng khởi động thần. Tôi đã thử bắt đầu thần bằng tay bằng cách chạy sudo /etc/init.d/god startvà điều đó dường như hoạt động tốt. Có ý kiến ​​gì không?


2
Tôi sẽ bắt đầu bằng cách thêm vào exec > /var/log/god/initlog 2>&1dưới dạng câu lệnh đầu tiên sau mkdirs, để bạn có thể thấy chính xác những gì đang diễn ra.
Đánh dấu Plotnick

Đăng kịch bản hoàn chỉnh, và đầu ra của ls -l /etc/rc.d/*god.
Gilles 'SO- ngừng trở nên xấu xa'

@MarkPlotnick Tôi không nghĩ kịch bản thậm chí đang chạy. Các thư mục cho các tệp nhật ký và tệp pid thậm chí không tồn tại sau khi khởi động lại, do đó, nó thậm chí không được truy cập vào mkdirs
PICyourBrain

@Gilles Tôi đã thử chạy ls -l /etc/rc.d/*godvà nhận được thông báo lỗi cannot access /etc/rc.d/*god: No such file or directory. Withink / etc / không có thư mục rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/
RC.d

Xin lỗi, vâng, ý tôi là ls -l /etc/rc?.d/*god- nhưng thực tế vấn đề của bạn có lẽ là dòng shebang xấu mà tôi phát hiện ra sau đó.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


4
#!/usr/bin/sh

Vị trí bình thường của sh, trong hầu hết mọi unix ngoài kia, là /bin/sh. Một số biến thể unix đã hợp nhất /bin/usr/bin, /usr/bin/shcũng hoạt động, nhưng cách di động là /bin/sh, vì vậy đó là những gì bạn nên sử dụng trong shebang. Quan trọng nhất đối với bạn, trên Debian, trừ khi bạn tránh đường, không có /usr/bin/sh.


1

Thay vào đó, tôi cố gắng sử dụng phiên bản này mà tôi đã tìm thấy qua google.

đoạn trích

#! /bin/sh
### BEGIN INIT INFO
# Provides:          god
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: God initscript
### END INIT INFO

# This is a Generated Init Script see the source: https://github.com/donnoman/cap-recipes/blob/master/lib/cap_recipes/tasks/god/god.init

# Author: Johnny Domino (domino@cmu.edu)
# Adapted: Donovan Bray (donnoman@donovanbray.com)

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH="/custom/ree/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
DESC="God Monitoring Tool"
NAME=god
CONF=/var/www/application/current/config/daemons.god
LEVEL=info
LOGFILE="/var/www/application/shared/log/god.log" ; mkdir -p `dirname $LOGFILE`
PIDFILE="/var/www/application/shared/pids/god.pid" ; mkdir -p `dirname $PIDFILE`
DAEMON=/var/www/application/current/bin/god
DAEMON_ARGS="-c $CONF -P $PIDFILE --log-level $LEVEL --log $LOGFILE"
SCRIPTNAME=/etc/init.d/god
OPEN_SOCKET=yes
USE_TERMINATE_ON_KILL=yes

# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
    [ "$OPEN_SOCKET" != no ] && sleep 3 && sh -c "chmod 0777 /tmp/god.*.sock;true"
}

# kills god + everything god is monitoring
do_terminate()
{
    $DAEMON terminate
    RETVAL="$?"
    return "$RETVAL"
}

#
# Function that stops the daemon/service
#
do_stop()
{
    $DAEMON quit
    RETVAL="$?"
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    log_daemon_msg "Reloading $DESC" "$NAME"
    $DAEMON load $CONF
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    if [ "$0" != "$SCRIPTNAME" ] && [ "$USE_TERMINATE_ON_KILL" = "yes" ]; then
      [ "$VERBOSE" != no ] && log_daemon_msg "Terminating $DESC" "$NAME"
      do_terminate
    else
      [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
      do_stop
    fi
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  terminate)
    [ "$VERBOSE" != no ] && log_daemon_msg "Terminating $DESC" "$NAME"
    do_terminate
    case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
    $DAEMON status && exit 0 || exit $?
    status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  reload|force-reload)
    do_reload
    log_end_msg $?
    ;;
  restart)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|terminate|force-reload}" >&2
    exit 3
    ;;
esac
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.