2010-09-07 13 views
5

¿Alguien ha tenido éxito al usar start-stop-daemon y mono-service2 juntos? He estado luchando contra esto durante unos días y he obtenido varios bits para trabajar, pero no he tenido éxito en obtener un script de inicio completamente funcional para un servicio mono.¿Éxito con start-stop-daemon y mono-service2?

Aquí es lo que he aprendido hasta la fecha:

  1. El mono o mono-servicio exe debe ser nombrado como el DAEMON variable (no se puede enumerar sus exe como el demonio)

  2. Debe utilizar el indicador --background ... de lo contrario, cuando este script se ejecuta desde un instalador de paquete (deb en mi caso). El servicio finaliza cuando finaliza el instalador (tiene algo que ver con la forma en que el instalador realiza los procesos ... No he investigado tanto).

  3. He tenido éxito al listar el archivo pid con el distintivo de servicio único en otros scripts y usarlo para detener el daemon, pero por alguna razón no funciona aquí. Como tal, la secuencia de comandos a continuación no detiene el servicio, no estoy seguro de por qué. El comienzo funciona bien

Y aquí es mi parte funcional script de inicio:

#! /bin/sh 
### BEGIN INIT INFO 
# Provides:   ServiceName 
# Required-Start: $remote_fs $syslog 
# Required-Stop:  $remote_fs $syslog 
# Default-Start:  2 3 4 5 
# Default-Stop:  0 1 6 
# Short-Description: Starts and Stops Service 
# Description:  Service start|stop|restart 
### END INIT INFO 

# Author: Author 
# 

# Do NOT "set -e" 

# PATH should only include /usr/* if it runs after the mountnfs.sh script 
PATH=/sbin:/usr/sbin:/bin:/usr/bin 
DESC="Description of the service" 
NAME=Service.exe 
DAEMONNAME=ServiceDaemon.sh 
INSTALLDIR=/usr/sbin/ 
DAEMON=/usr/bin/mono-service2 
EXENAME=Service.exe 
PIDFILE=/var/run/$DAEMONNAME.pid 
DAEMON_ARGS=" -l:$PIDFILE $INSTALLDIR/$EXENAME" 
#DAEMON_ARGS=" $INSTALLDIR/$EXENAME" 
SCRIPTNAME=/etc/init.d/$DAEMONNAME 

# Exit if the package is not installed 
[ -x "$DAEMON" ] || exit 0 

# Read configuration variable file if it is present 
[ -r /etc/default/$NAME ] && . /etc/default/$NAME 

# Load the VERBOSE setting and other rcS variables 
. /lib/init/vars.sh 

# Define LSB log_* functions. 
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present. 
. /lib/lsb/init-functions 

# 
# Function that starts the daemon/service 
# 
do_start() 
{ 
# Return 
# 0 if daemon has been started 
# 1 if daemon was already running 
# 2 if daemon could not be started 
start-stop-daemon --start --quiet --background --exec $DAEMON --test > /dev/null \ 
    || return 1 
start-stop-daemon --start --quiet --background --exec $DAEMON -- \ 
    $DAEMON_ARGS \ 
    || return 2 
# Add code here, if necessary, that waits for the process to be ready 
# to handle requests from services started subsequently which depend 
# on this one. As a last resort, sleep for some time. 
} 

# 
# Function that stops the daemon/service 
# 
do_stop() 
{ 
# Return 
# 0 if daemon has been stopped 
# 1 if daemon was already stopped 
# 2 if daemon could not be stopped 
# other if a failure occurred 
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --name $NAME 
RETVAL="$?" 
[ "$RETVAL" = 2 ] && return 2 
# Wait for children to finish too if this is a daemon that forks 
# and if the daemon is only ever run from this initscript. 
# If the above conditions are not satisfied then add some other code 
# that waits for the process to drop all resources that could be 
# needed by services started subsequently. A last resort is to 
# sleep for some time. 
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON 
[ "$?" = 2 ] && return 2 
# Many daemons don't delete their pidfiles when they exit. 
rm -f $PIDFILE 
return "$RETVAL" 
} 

# 
# Function that sends a SIGHUP to the daemon/service 
# 
do_reload() { 
# 
# If the daemon can reload its configuration without 
# restarting (for example, when it is sent a SIGHUP), 
# then implement that here. 
# 
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME 
return 0 
} 

case "$1" in 
    start) 
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" 
do_start 
case "$?" in 
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
esac 
;; 
    stop) 
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" 
do_stop 
case "$?" in 
    0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 
    2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; 
esac 
;; 
    status) 
     status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? 
     ;; 
    #reload|force-reload) 
# 
# If do_reload() is not implemented then leave this commented out 
# and leave 'force-reload' as an alias for 'restart'. 
# 
#log_daemon_msg "Reloading $DESC" "$NAME" 
#do_reload 
#log_end_msg $? 
#;; 
    restart|force-reload) 
# 
# If the "reload" option is implemented then remove the 
# 'force-reload' alias 
# 
log_daemon_msg "Restarting $DESC" "$NAME" 
do_stop 
case "$?" in 
    0|1) 
    do_start 
    case "$?" in 
    0) log_end_msg 0 ;; 
    1) log_end_msg 1 ;; # Old process is still running 
    *) log_end_msg 1 ;; # Failed to start 
    esac 
    ;; 
    *) 
    # Failed to stop 
    log_end_msg 1 
    ;; 
esac 
;; 
    *) 
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 
exit 3 
;; 
esac 

: 

Respuesta

12

Hemos tenido un montón de problemas con mono-servicio y terminó la implementación de nuestro propio código "servicio" en nuestra aplicación. Nada dura, sólo sacar algunas señales:

UnixSignal intr = new UnixSignal (Signum.SIGINT); 
UnixSignal term = new UnixSignal (Signum.SIGTERM); 
UnixSignal hup = new UnixSignal (Signum.SIGHUP); 
UnixSignal usr2 = new UnixSignal (Signum.SIGUSR2); 

UnixSignal[] signals = new UnixSignal[] { intr, term, hup, usr2 }; 

for (bool running = true; running;) 
{ 
    int idx = UnixSignal.WaitAny(signals); 

    if (idx < 0 || idx >= signals.Length) continue; 

    log.Debug("daemon: received signal " + signals[idx].Signum.ToString()); 

    if ((intr.IsSet || term.IsSet)) 
    { 
     intr.Reset(); 
     term.Reset(); 

     log.Debug("daemon: stopping..."); 

     running = false; 
    } 
    else if (hup.IsSet) 
    { 
     // Ignore. Could be used to reload configuration. 
     hup.Reset(); 
    } 
    else if (usr2.IsSet) 
    { 
     usr2.Reset(); 
     // do something 
    } 
} 
1

Tengo este script de trabajo con un par de cambios de menor importancia:

  • Un pidfile en/var/sólo se ejecutan funciona si se ejecuta como root - si intenta ejecutar el script sin sudo, el servicio mono fallará en silencio.

  • Utilice --pidfile en lugar de --name para encontrar el servicio que se debe detener.

3

Sé que esta pregunta es antigua, pero no hay respuestas aceptadas. Estuve jugando un poco con esto por un tiempo y saqué una secuencia de comandos daemon que funcionó como un encanto para mí. Blogged sobre él aquí: http://www.geekytidbits.com/start-stop-daemon-with-mono-service2/

+3

Si bien esto puede responder teóricamente a la pregunta, nos gustaría que incluya las partes esenciales del artículo vinculado en su respuesta, y proporcione el [enlace de referencia] (http://meta.stackexchange.com/q/8259) Si no se hace eso, la respuesta corre peligro a causa de la podredumbre del enlace. – Kev

1
do_stop() 
{ 

test -f $PIDFILE && kill `cat $PIDFILE` && return 2 

start-stop-daemon --stop --quiet --verbose --oknodo --retry=0/30/KILL/5\ 

--exec mono-service2 

[ "$?" = 2 ] && return 2 

# Many daemons don't delete their pidfiles when they exit. 

rm -f $PIDFILE 

return "$RETVAL" 

} 

por lo que funciona, creo que simplemente porque no se puede detener un proceso mediante el comando "start-stop-daemon" estoy aprendiendo a usar mono ahora, su invitación me ayuda mucho. Gracias. mi inglés es pobre, perdona mi inglés a medio hacer.

Cuestiones relacionadas