서비스를 만들려고 했지만 시작할 수 없습니다.

서비스를 만들려고 했지만 시작할 수 없습니다.

이것이 뻔한 대답이라면 죄송합니다. 저는 홈 랩에서 새로운 것을 배우기 위해 Linux만 사용하는 전문 Windows 관리자이기 때문에 Linux에 대한 경험이 매우 부족합니다.

Sonarr를 설치/구성하기 위해 Puppet 모듈을 작성 중인데 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이 사용자의 홈 디렉토리를 관리하도록 했습니다. 마지막으로 서비스 사용자가 셸을 /bin/false로 설정했을 때 비슷한 문제가 발생했다는 다른 Stack Exchange 답변을 찾은 후 사용자의 셸을 /bin/bash로 설정했습니다.

이러한 문제를 모두 해결하자 서비스가 원활하게 진행되기 시작했습니다. 이것이 단지 이들 중 하나인지 아니면 여러 가지가 결합된 것인지는 확실하지 않지만, 나중에 비슷한 문제가 발생할 경우 다른 사람들에게도 도움이 되기를 바랍니다.

관련 정보