Tentando criar um serviço, mas ele não será iniciado

3

Desculpas se esta é uma resposta óbvia, eu sou um administrador do Windows profissionalmente e só uso o Linux no meu homelab para tentar aprender coisas novas - então eu sou muito inexperiente com o Linux.

Estou trabalhando para escrever um módulo Puppet para instalar / configurar o Sonarr, e estou tendo problemas para instalar o Sonarr como um serviço (testando no Ubuntu 14.04 LTS). A instalação e a criação do script estão indo bem, mas estou com problemas para fazer o serviço realmente iniciar . Aqui está o script init.d que tenho, cortesia do roubo descarado da internet:

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

O problema é que isso não será iniciado. Ou, mais precisamente, ele é iniciado, mas o syslog mostra que o processo está falhando e sendo reiniciado várias vezes. O que mais me intriga é que, se eu executar /etc/init.d/nzbdrone start , o processo começa bem. É somente quando executo service nzbdrone start que ele inicia o travamento repetidamente. Meu google-fu apareceu esta questão semelhante, mas a resposta lá mencionou variáveis de ambiente e não consigo identificar nada neste script que não esteja sendo inicializado pelo script. Alguém pode me ajudar a ver o que está acontecendo aqui?

    
por Chris 04.03.2016 / 18:26

1 resposta

0

Acabei encontrando o problema ou possivelmente problemas. A primeira vez que notei que no meu código Puppet que estava criando o usuário para executar o serviço, a variável para o diretório home do usuário foi digitada incorretamente (o que fez com que o diretório home do usuário fosse definido como "/ home /" em / etc / passwd). Segundo, percebi que o Puppet não cria automaticamente o diretório inicial, a menos que você diga, então eu fui em frente e fiz Puppet gerenciar o diretório home do usuário. Finalmente, eu configurei o shell do usuário para / bin / bash depois de encontrar outra resposta do Stack Exchange que mencionou que eles tinham um problema semelhante quando o shell do usuário do serviço estava configurado para / bin / false.

Quando corrijo todos esses problemas, o serviço começa bem. Não tenho certeza se foi apenas uma dessas ou uma combinação de várias, mas espero que isso ajude alguém se elas se depararem com problemas semelhantes no futuro.

    
por 09.03.2016 / 01:22