serviço não funciona

0

Antecedentes

  • Estou usando este script para tornar meu script em execução como serviço .
  • Estou usando o Linux Mint 17.3 Rosa.

O problema

Às vezes, o início / parada funciona às vezes não. Às vezes, eu tenho que matar manualmente o processo porque o comando de parada de serviço não faz isso.

Observe que o script usa a ferramenta daemon .

#!/bin/sh

name="TEST"  
# The path of the client executable
command="${HOME}/myscript.sh"   
# Any command line arguments for the client executable
command_args=""  
# The path of the daemon executable
daemon="/usr/bin/daemon"

[ -x "$daemon" ] || exit 0
[ -x "$command" ] || exit 0

# Note: The following daemon option arguments could be in /etc/daemon.conf


# Any command line arguments for the daemon executable (when starting)
daemon_start_args="" # e.g. --inherit --env="ENV=VAR" --unsafe  

# The pidfile directory (need to force this so status works for normal users)
pidfiles="/var/run"  
# The user[:group] to run as (if not to be run as root)
user=""  
# The path to chroot to (otherwise /)
chroot=""  
# The path to chdir to (otherwise /)
chdir=""  
# The umask to adopt, if any
umask=""  
# The syslog facility or filename for the client's stdout (otherwise discarded)
stdout="daemon.info"  
# The syslog facility or filename for the client's stderr (otherwise discarded)
stderr="daemon.err"

case "$1" in  
    start)
        # This if statement isn't strictly necessary but it's user friendly
        if "$daemon" --running --name "$name" --pidfiles "$pidfiles"
        then
            echo "$name is already running."
        else
            echo -n "Starting $name..."
            "$daemon" --respawn $daemon_start_args \
                --name "$name" --pidfiles "$pidfiles" \
                ${user:+--user $user} ${chroot:+--chroot $chroot} \
                ${chdir:+--chdir $chdir} ${umask:+--umask $umask} \
                ${stdout:+--stdout $stdout} ${stderr:+--stderr $stderr} \
                -- \
                "$command" $command_args
            echo done.
        fi
        ;;

    stop)
        # This if statement isn't strictly necessary but it's user friendly
        if "$daemon" --running --name "$name" --pidfiles "$pidfiles"
        then
            echo -n "Stopping $name..."
            "$daemon" --stop --name "$name" --pidfiles "$pidfiles"
            echo done.
        else
            echo "$name is not running."
        fi
        ;;

    restart|reload)
        if "$daemon" --running --name "$name" --pidfiles "$pidfiles"
        then
            echo -n "Restarting $name..."
            "$daemon" --restart --name "$name" --pidfiles "$pidfiles"
            echo done.
        else
            echo "$name is not running."
            exit 1
        fi
        ;;

    status)
        "$daemon" --running --name "$name" --pidfiles "$pidfiles" --verbose
        ;;

    *)
        echo "usage: $0 <start|stop|restart|reload|status>" >&2
        exit 1
esac

exit 0  
myscript.sh:
#!/bin/bash

cd $HOME/Stuff/
$(which node) app.js 

Tenta corrigir isso

1. Use o daemon start-stop

Como alternativa, tentei usar este que usa o start-stop-daemon mas isso não funciona de todo.

2. Depurando daemon script

Para tentar depurar isso, ativei a depuração no comando daemon . Então tentei iniciar e parar meu serviço.

Quando inicio o serviço:

Starting TEST...daemon: debug: handle_stdout_option(spec = daemon.info)
daemon: debug: store_syslog(spec = daemon.info)
daemon: debug: handle_stderr_option(spec = daemon.err)
daemon: debug: store_syslog(spec = daemon.err)
daemon: debug: config()
daemon: debug: config_load(configfile = /etc/daemon.conf)
daemon: debug: config_load(configfile = /root/.daemonrc)
daemon: debug: config_process(target = *)
daemon: debug: config_process(target = TEST)
daemon: debug: handle_name_option(spec = TEST)
daemon: debug: handle_pidfiles_option(spec = /var/run)
daemon: debug: handle_stdout_option(spec = daemon.info)
daemon: debug: store_syslog(spec = daemon.info)
daemon: debug: handle_stderr_option(spec = daemon.err)
daemon: debug: store_syslog(spec = daemon.err)
daemon: debug: sanity_check()
daemon: debug:  preventing core files
daemon: debug:  constructing pidfile path
daemon: debug:  constructing command line arguments for the client
daemon: debug:  checking the client command
daemon: debug: safety_check("/home/myPC/myscript.sh")
daemon: debug:  checking "/home/myPC/myscript.sh"
daemon: debug:  checking #! interpreter: /bin/bash
TEST: debug:  becoming a daemon and locking pidfile
done.

E o serviço foi iniciado.

Quando eu paro o serviço:

Stopping TEST...daemon: debug: config()
daemon: debug: config_load(configfile = /etc/daemon.conf)
daemon: debug: config_load(configfile = /root/.daemonrc)
daemon: debug: config_process(target = *)
daemon: debug: config_process(target = TEST)
daemon: debug: handle_name_option(spec = TEST)
daemon: debug: handle_pidfiles_option(spec = /var/run)
daemon: debug: sanity_check()
daemon: debug:  preventing core files
daemon: debug:  constructing pidfile path
daemon: debug: show()
daemon: debug:  options:
daemon: debug:   config <none>, noconfig 0, name TEST, command "<none>", uid 0, gid 0, init_groups 0, chroot <none>, chdir <none>, umask 22, inherit no, respawn no, acceptable 300, attempts 5, delay 300, limit 0, idiot 0, foreground no, pty no, noecho no, stdout <none>, stderr <none>, errlog daemon.err, dbglog daemon.debug, core no, unsafe no, safe no, stop yes, running no, verbose 0, debug 3
daemon: debug:  command line:
daemon: debug:   environment:
daemon: debug:    SUDO_GID=1000
daemon: debug:    MAIL=/var/mail/root
daemon: debug:    USER=root
daemon: debug:    HOME=/home/myPC
daemon: debug:    LC_MONETARY=en_US.UTF-8
daemon: debug:    COLORTERM=mate-terminal
daemon: debug:    SUDO_UID=1000
daemon: debug:    LOGNAME=root
daemon: debug:    TERM=xterm
daemon: debug:    USERNAME=root
daemon: debug:    PATH=.../home/myPC/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
daemon: debug:    LC_ADDRESS=en_US.UTF-8
daemon: debug:    DISPLAY=:0.0
daemon: debug:    LC_TELEPHONE=en_US.UTF-8
daemon: debug:    LANG=en_US.UTF-8
daemon: debug:    LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
daemon: debug:    XAUTHORITY=/home/myPC/.Xauthority
daemon: debug:    SUDO_COMMAND=/usr/bin/env PATH=.../home/myPC/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /etc/init.d/moda stop
daemon: debug:    LC_NAME=en_US.UTF-8
daemon: debug:    SHELL=/bin/bash
daemon: debug:    SUDO_USER=myPC
daemon: debug:    LC_MEASUREMENT=en_US.UTF-8
daemon: debug:    LC_IDENTIFICATION=en_US.UTF-8
daemon: debug:    PWD=/home/myPC
daemon: debug:    LC_NUMERIC=en_US.UTF-8
daemon: debug:    LC_PAPER=en_US.UTF-8
daemon: debug:  stopping daemon /var/run/TEST.pid
done.

Mas o serviço nunca para.

Mesmo que eu tente sudo kill -9 PID , ele não para sempre (ocasionalmente ele parará de usar isso, mas não consistentemente).

Meu processo de depuração

Estou executando o serviço como:

 sudo /etc/init.d/test start

Eu, então, assisto desse jeito usando ps e lsof .

ps
$ ps aux |grep TEST
root      4393  0.0  0.1  20036  1348 ?        S    13:41   0:00 /usr/bin/daemon --respawn --name TEST --pidfiles /var/run --debug=3 --stdout daemon.info --stderr daemon.err -- /home/myPC/myscript.sh
root      4394  0.0  0.0      0     0 ?        Z    13:41   0:00 [myscript.sh] <defunct>
lsof
$ sudo lsof -p 4393
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID USER   FD   TYPE             DEVICE SIZE/OFF   NODE NAME
daemon  4393 root  cwd    DIR                8,2     4096      2 /
daemon  4393 root  rtd    DIR                8,2     4096      2 /
daemon  4393 root  txt    REG                8,2   190280 923071 /usr/bin/daemon
daemon  4393 root  mem    REG                8,2    43616 667389 /lib/x86_64-linux-gnu/libnss_files-2.19.so
daemon  4393 root  mem    REG                8,2    47760 667228 /lib/x86_64-linux-gnu/libnss_nis-2.19.so
daemon  4393 root  mem    REG                8,2    97296 667121 /lib/x86_64-linux-gnu/libnsl-2.19.so
daemon  4393 root  mem    REG                8,2    39824 667115 /lib/x86_64-linux-gnu/libnss_compat-2.19.so
daemon  4393 root  mem    REG                8,2  2924352 927252 /usr/lib/locale/locale-archive
daemon  4393 root  mem    REG                8,2  1840928 667355 /lib/x86_64-linux-gnu/libc-2.19.so
daemon  4393 root  mem    REG                8,2    10680 667382 /lib/x86_64-linux-gnu/libutil-2.19.so
daemon  4393 root  mem    REG                8,2   141574 667155 /lib/x86_64-linux-gnu/libpthread-2.19.so
daemon  4393 root  mem    REG                8,2   149120 667163 /lib/x86_64-linux-gnu/ld-2.19.so
daemon  4393 root    0u   CHR                1,3      0t0   1029 /dev/null
daemon  4393 root    1u   CHR                1,3      0t0   1029 /dev/null
daemon  4393 root    2u   CHR                1,3      0t0   1029 /dev/null
daemon  4393 root    3uW  REG               0,17        5  22031 /run/TEST.pid
daemon  4393 root    4u  unix               0xf..     0t0  22032 socket
daemon  4393 root    7r  FIFO                0,9      0t0  22034 pipe
daemon  4393 root    9r  FIFO                0,9      0t0  22035 pipe

Pergunta

A única coisa que notei é que nas informações acima, posso ver /run/TEST.pid , mas isso também aparece aqui também:

/var/run/TEST.pid

O script daemon usa apenas o diretório /var/run . Não tenho certeza se isso é suposto acontecer ou não?

    
por George 30.06.2016 / 11:34

0 respostas