Come posso eseguire uno script di shell come demone sotto Redhat?


12

Ho uno script di shell, che è essenzialmente una riga con un po 'di registrazione, che sto cercando di eseguire da uno script di init. Sto usando la daemonfunzione dentro di /etc/init.d/functionsper eseguirlo, in quanto Redhat non sembra essere start-stop-daemondisponibile. Quando chiamo lo script init ( /etc/init.d/script start) rimane in primo piano, piuttosto che completare e lasciare il processo in esecuzione. Qual è il modo corretto per me di ottenere questo script demonizzato?

Script da eseguire:

# conf file where variables are defined
. /etc/script.conf

echo "Starting..." | logger -i
echo "Monitoring $LOG_LOCATION." | logger -i
echo "Sending to $MONITOR_HOST:$MONITOR_PORT." | logger -i

tail -n 1 -F $LOG_LOCATION |
grep WARN --line-buffered  |
/usr/bin/nc -vv $MONITOR_HOST $MONITOR_PORT 2>&1 |
logger -i

script init:

#!/bin/bash


# Source Defaults
. /etc/default/script

# Source init functions
. /etc/init.d/functions

prog=/usr/local/bin/script.sh

[ -f /etc/script.conf ] || exit 1

RETVAL=0

start()
{
    # Quit if disabled
    if ! $ENABLED; then
            echo "Service Disabled in /etc/default/script"
            exit 1
    fi

    echo "Starting $prog"

    daemon $prog

    RETVAL=$?

    return $RETVAL
}

stop ()
{
    echo -n $"Stopping $prog: "
    killproc $prog

    RETVAL=$?

    return $RETVAL
}

reload()
{
    echo "Reload command is not implemented for this service."
    return $RETVAL
}

restart()
{
    stop
    start
}

condrestart()
{
    echo "Not Implemented."
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status $prog
        ;;
    restart)
        restart
        ;;
    reload)
        reload
        ;;
    condrestart)
        condrestart
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
        RETVAL=1
esac

Ultime ~ 20 righe di esecuzione con bash -vx:

+ case "$1" in
+ start
+ true
+ echo 'Starting /usr/local/bin/script.sh'
Starting /usr/local/bin/script.sh
+ daemon /usr/local/bin/script.sh
+ local gotbase= force=
+ local base= user= nice= bg= pid=
+ nicelevel=0
+ '[' /usr/local/bin/script.sh '!=' /usr/local/bin/script.sh ']'
+ '[' -z '' ']'
+ base=script.sh
+ '[' -f /var/run/script.sh.pid ']'
+ '[' -n '' -a -z '' ']'
+ ulimit -S -c 0
+ '[' -n '' ']'
+ '[' color = verbose -a -z '' ']'
+ '[' -z '' ']'
+ initlog -q -c /usr/local/bin/script.sh

Mi sembra utile che tu esegua quello script bash -vx ...e pubblichi le ultime righe in modo che possiamo vedere ciò che rimane in primo piano.
Hauke ​​Laging,

1
Non preoccuparti di usare questo diritto e vai avanti daemon, c'è anche un pacchetto RPM . A proposito, ci sono molti strumenti di monitoraggio dei log là fuori ( inizia qui ).
sr_

Hauke, vuoi dire usando una prima riga di #!/bin/bash -vx? Ho provato a farlo, ma non ha prodotto lo stesso output dello script init come se avessi eseguito direttamente lo script della shell.
bshacklett,

@bshacklett puoi esaminare la funzione di qualsiasi script di init (qualsiasi script di shell in realtà) eseguendolo esplicitamente con bash -vx, ad es. bash -vx /etc/init.d/script start.
sr_

1
@bshacklett Wrt logs, darei un'occhiata più da vicino a logstash . L'archivio può ricevere i log direttamente da Log4j, ma l'agente logstash può anche monitorare i file di log
sr_

Risposte:


2

Ho trovato uno script su http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-process.html#post897522 che sono stato in grado modificare per soddisfare le mie esigenze. Tiene traccia manualmente del PID e crea un file PID usando pidof. Ho finito per doverlo modificare per usarlo pgrepperché pidofnon ero in grado di vedere il PID del mio script. Dopo quella modifica, ha funzionato bene. * Nota, pgrep sembra funzionare solo se il nome completo dello script ha una lunghezza inferiore a 15 caratteri

Ecco cosa ho finito con:

#!/bin/bash
#
# 
#
# Start on runlevels 3, 4 and 5. Start late, kill early.
# chkconfig: 345 95 05
#
#
#!/bin/bash

# absolute path to executable binary
progpath='/usr/local/bin/script.sh'

# arguments to script
opts=''

# binary program name
prog=$(basename $progpath)

# pid file
pidfile="/var/run/${prog}.pid"

# make sure full path to executable binary is found
! [ -x $progpath ] && echo "$progpath: executable not found" && exit 1

eval_cmd() {
  local rc=$1
  if [ $rc -eq 0 ]; then
    echo '[  OK  ]'
  else
    echo '[FAILED]'
  fi
  return $rc
}

start() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -n "$pids" ]; then
    echo "$prog (pid $pids) is already running"
    return 0
  fi
  printf "%-50s%s" "Starting $prog: " ''
  $progpath $opts &

  # save pid to file if you want
  echo $! > $pidfile

  # check again if running
  pgrep $prog >/dev/null 2>&1
  eval_cmd $?
}

stop() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -z "$pids" ]; then
    echo "$prog not running"
    return 0
  fi
  printf "%-50s%s" "Stopping $prog: " ''
  rm -f $pidfile
  kill -9 $pids
  eval_cmd $?
}

status() {
  # see if running
  local pids=$(pgrep $prog)

  if [ -n "$pids" ]; then
    echo "$prog (pid $pids) is running"
  else
    echo "$prog is stopped"
  fi
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    sleep 1
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit $?

0

Non conosco Redhat ma daemon $prog &mi sembra strano. Se esiste già una funzione per la demonizzazione, perché dovrebbe essere necessario (e utile) mettere questa funzione in secondo piano? Quindi prova senza &.


4
Non è sbagliato /etc/init.d/functionsdefinisce una daemonfunzione che si aspetta che il suo argomento si demoni, si occupa solo di cose come cambiare l'utente, impostare ulimits, controllare (non creare!) un pidfile ... Il miglior uso di questa daemonfunzione è sostituirlo con libslackdaemon ;)
sr_

Mi dispiace, e ero lì a un certo punto mentre stavo risolvendo i problemi. Non intendevo includerlo in questo post.
bshacklett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.