Tengo un script de shell, que es esencialmente un trazador de líneas con algún registro, que estoy tratando de ejecutar esto desde un script de inicio. Estoy usando la daemon
función dentro de /etc/init.d/functions
para ejecutarlo, ya que Redhat no parece tener start-stop-daemon
disponible. Cuando llamo al script de inicio ( /etc/init.d/script start
) permanece en primer plano, en lugar de completar y dejar el proceso en ejecución. ¿Cuál es la forma correcta para mí de demonizar este script?
Script a ejecutar:
# 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
guión de inicio:
#!/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
Últimas ~ 20 líneas de ejecución 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
shell-script
rhel
init-script
bshacklett
fuente
fuente
bash -vx ...
y publique las últimas líneas para que podamos ver lo que queda en primer plano.daemon
, también hay un paquete RPM . Por cierto, hay muchas herramientas de monitoreo de registros por ahí ( comience aquí ).#!/bin/bash -vx
? Intenté hacer esto, pero no produjo el mismo resultado del script de inicio que si ejecuto el script de shell directamente.bash -vx
, es decir.bash -vx /etc/init.d/script start
.Respuestas:
Encontré un script en http://www.linuxforums.org/forum/programming-scripting/190279-daemon-etc-init-d-functions-does-not-return-launching-process.html#post897522 que pude para modificar para satisfacer mis necesidades. Rastrea manualmente el PID y crea un archivo PID usando
pidof
. Terminé teniendo que modificar esto para usarlo,pgrep
ya quepidof
no podía ver el PID de mi script. Después de esa modificación, funcionó bien. * Nota, pgrep parece funcionar solo si el nombre completo del script tiene menos de 15 caracteresEsto es lo que terminé con:
fuente
No conozco a Redhat, pero me
daemon $prog &
parece extraño. Si ya existe una función para demonizar, ¿por qué debería ser necesario (y útil) poner esta función en segundo plano? Por lo tanto, intente sin el&
.fuente
/etc/init.d/functions
define unadaemon
función que espera que su argumento se demonice a sí mismo, solo se ocupa de cosas como cambiar el usuario, establecer ulimits, verificar (¡no crear!) un archivo pid ... El mejor uso de estadaemon
función es reemplazarlo con libslack'sdaemon
;)