尝试创建服务但无法启动

尝试创建服务但无法启动

如果这是一个显而易见的答案,我很抱歉,我是一名专业的 Windows 管理员,只在我的家庭实验室中使用 Linux 来尝试学习新东西 - 所以我对 Linux 非常缺乏经验。

我正在编写一个 Puppet 模块来安装/配置 Sonarr,但在将 Sonarr 设置为服务时遇到了麻烦(在 Ubuntu 14.04 LTS 上测试)。脚本的安装和创建进展顺利,但我在使服务实际运行时遇到了问题开始。这是我从互联网上无耻窃取的 init.d 脚本:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          nzbdrone
# Required-Start:    $local_fs $network $syslog
# Required-Stop:     $local_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Example
# Description:       Example start-stop-daemon - Debian
### END INIT INFO

NAME="nzbdrone"
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
APPDIR="/opt/NzbDrone"
APPBIN="/usr/bin/mono"
APPARGS="/opt/NzbDrone/NzbDrone.exe"
USER="nzbdrone"
GROUP="nzbdrone"

# Include functions 
set -e
. /lib/lsb/init-functions

start() {
  printf "Starting '$NAME'... "
  start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile /var/run/$NAME.pid --chdir "$APPDIR" --exec "$APPBIN" -- $APPARGS || true
  printf "done\n"
}

#We need this function to ensure the whole process tree will be killed
killtree() {
    local _pid=$1
    local _sig=${2-TERM}
    for _child in $(ps -o pid --no-headers --ppid ${_pid}); do
        killtree ${_child} ${_sig}
    done
    kill -${_sig} ${_pid}
}

stop() {
  printf "Stopping '$NAME'... "
  [ -z `cat /var/run/$NAME.pid 2>/dev/null` ] || \
  while test -d /proc/$(cat /var/run/$NAME.pid); do
    killtree $(cat /var/run/$NAME.pid) 15
    sleep 0.5
  done 
  [ -z `cat /var/run/$NAME.pid 2>/dev/null` ] || rm /var/run/$NAME.pid
  printf "done\n"
}

status() {
  status_of_proc -p /var/run/$NAME.pid "" $NAME && exit 0 || exit $?
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  status)
    status
    ;;
  *)
    echo "Usage: $NAME {start|stop|restart|status}" >&2
    exit 1
    ;;
esac

exit 0

问题是,这不会开始。或者更准确地说,它启动了,但系统日志显示该进程正在崩溃,然后重新启动,一遍又一遍。让我困惑的是,如果我跑步/etc/init.d/nzbdrone start,这个过程就会开始得很好。这是仅有的当我运行service nzbdrone start它时,它开始一遍又一遍地崩溃。我的 google-fu 出现了类似的问题,但那里的答案提到了环境变量,我在这个脚本中找不到任何未被脚本初始化的内容。谁能帮我看看这里发生了什么?

答案1

我最终发现了问题,或者可能是问题。我首先注意到,在创建用户来运行服务的 Puppet 代码中,用户主目录的变量拼写错误(这导致用户主目录在 /etc/passwd 中设置为“/home/”)。其次,我意识到 Puppet 不会自动创建主目录,除非您告诉它,所以我继续让 Puppet 管理用户的主目录。最后,在找到另一个 Stack Exchange 答案后,我将用户的 shell 设置为 /bin/bash,该答案提到当服务用户的 shell 设置为 /bin/false 时,他们遇到了类似的问题。

当我纠正了所有这些问题后,服务就开始顺利了。我不确定这只是其中之一还是多个的组合,但希望这会在其他人将来遇到类似问题时对其有所帮助。

相关内容