¿Conseguir que el script de shell se ejecute como un demonio en CentOS?

8

EDITAR: Por alguna razón, la mitad de mi publicación se truncó, no estoy seguro de lo que sucedió. Actualizaré pronto y publicaré que se actualiza aquí en la parte superior.

EDITAR: He actualizado la publicación nuevamente, perdón por la pregunta incompleta.

EDITAR (8:55 PM EST 10/10/2011): Actualicé /srv/rhodecode/start.sh como sugirió Steven, todavía no hay alegría. Sigue colgando así:

[lpeabody@vcs rhodecode]$ sudo /etc/init.d/rhodecode-server start
Starting rhodecode-server:

He actualizado los scripts a continuación para mostrar los cambios.


Nunca he escrito un guión de shell o bash en mi vida. Estoy tratando de instalar RhodeCode en CentOS, y hay scripts de inicio para Debian y Gentoo, pero no para RedHat / CentOS, que es una locura para mí. Entonces necesito escribir uno porque nuestro entorno de servidor está restringido a ejecutar CentOS 5. La fuente del proyecto se puede encontrar en Bitbucket aquí .

La idea es ejecutar RhodeCode con Celery y RabbitMQ. Todo está escrito en Python y tengo el entorno en su propio contenedor virtual separado usando virtualenv. Tengo la idea para el script de shell aquí .

Creé un usuario del sistema llamado rhodecode y creé el directorio / var / run / rhodecode y es propiedad de rhodecode. También he creado / var / www / rhodecode donde reside la producción.ini, así como /srv/rhodecode/start.sh, todo lo cual es propiedad de rhodecode.

Permisos:

[lpeabody@vcs run]$ ll -a /var/run/rhodecode
total 12
drwxr-xr-x  2 rhodecode rhodecode 4096 Oct 10 15:57 .
drwxr-xr-x 21 root      root      4096 Oct 10 16:07 ..

[lpeabody@vcs run]$ ll -a /var/www/rhodecode
total 76
drwxr-xr-x  4 rhodecode rhodecode  4096 Oct 10 16:47 .
drwxr-xr-x 11 root      root       4096 Oct  5 14:54 ..
drwxrwxr-x  3 rhodecode rhodecode  4096 Oct  5 19:40 data
-rw-r--r--  1 rhodecode rhodecode     0 Oct 10 16:41 debug.log
-rw-r--r--  1 rhodecode rhodecode  1466 Oct 10 16:41 error.log
-rw-rw-r--  1 rhodecode rhodecode  6000 Oct  6 15:27 production.ini
drwxrwxr-x  2 rhodecode rhodecode  4096 Oct  5 18:37 repos
-rw-r--r--  1 rhodecode rhodecode 44032 Oct  5 19:16 rhodecode.db

[lpeabody@vcs run]$ ll -a /srv/rhodecode/
total 16
drwxr-xr-x 2 rhodecode rhodecode 4096 Oct 10 16:40 .
drwxr-xr-x 4 root      root      4096 Oct  7 14:40 ..
-rwxr-xr-x 1 rhodecode rhodecode  277 Oct 10 16:40 start.sh

Tengo los siguientes scripts de bash y shell.

/srv/rhodecode/start.sh

#!/bin/bash                                                                                               
# run this as the rhodecode user!                                                                         

WDIR=/var/www/rhodecode                                                                                   
VIRTUALENV_DIR=/opt/python_virtualenvironments/rhodecode-venv                                             
export PYTHON_EGG_CACHE=/tmp/.python-eggs                                                                 

source $VIRTUALENV_DIR/bin/activate                                                                       

cd $WDIR                                                                                                  
exec paster serve production.ini 1> debug.log 2> error.log

/etc/init.d/rhodecode-server

#!/bin/sh                                                                                                                                                                                                                                    
#                                                                                                                                                                                                                                            
# rhodecode-server RhodeCode server instance                                                                                                                                                                                                 
#                                                                                                                                                                                                                                            
#                                                                                                                                                                                                                                            

# PATH=/sbin:/usr/sbin:/bin:/usr/bin                                                                                                                                                                                                         
NAME=rhodecode-server                                                                                                                                                                                                                        
DESC=rhodecode-server                                                                                                                                                                                                                        
USER=rhodecode                                                                                                                                                                                                                               
PID_FILE=/var/run/rhodecode/pid                                                                                                                                                                                                              
CMD=/srv/rhodecode/start.sh                                                                                                                                                                                                                  

LOCK_FILE=/var/lock/subsys/$NAME                                                                                                                                                                                                             

. /etc/init.d/functions                                                                                                                                                                                                                      

RETVAL=0                                                                                                                                                                                                                                     

remove_pid () {                                                                                                                                                                                                                              
    rm -f ${PID_FILE}                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                            

start_rhodecode () {                                                                                                                                                                                                                         
    daemon --user $USER --pidfile $PID_FILE $CMD                                                                                                                                                                                        
    RETVAL=$?                                                                                                                                                                                                                                
    [ $RETVAL -eq 0 ] && touch $LOCK_FILE                                                                                                                                                                                                    
    return $RETVAL                                                                                                                                                                                                                           
}                                                                                                                                                                                                                                            

stop_rhodecode () {                                                                                                                                                                                                                          
    killproc -p $PID_FILE                                                                                                                                                                                                                    
    RETVAL=&?                                                                                                                                                                                                                                
    rm -f $LOCK_FILE                                                                                                                                                                                                                         
    rm -f $PID_FILE                                                                                                                                                                                                                          
    return $RETVAL                                                                                                                                                                                                                           
}                                                                                                                                                                                                                                            

restart_rhodecode () {                                                                                                                                                                                                                       
    stop_rhodecode                                                                                                                                                                                                                           
    start_rhodecode                                                                                                                                                                                                                          
    RETVAL=$?                                                                                                                                                                                                                                
}                                                                                                                                                                                                                                            

case "$1" in                                                                                                                                                                                                                                 
  start)                                                                                                                                                                                                                                     
    echo -n $"Starting $DESC: "                                                                                                                                                                                                              
    start_rhodecode                                                                                                                                                                                                                          
    echo                                                                                                                                                                                                                                     
    ;;                                                                                                                                                                                                                                       
  stop)                                                                                                                                                                                                                                      
    echo -n $"Stopping $DESC: "                                                                                                                                                                                                              
    stop_rhodecode                                                                                                                                                                                                                           
    echo                                                                                                                                                                                                                                     
    ;;                                                                                                                                                                                                                                       
  restart)                                                                                                                                                                                                                                   
    echo -n $"Restarting $DESC: "                                                                                                                                                                                                            
    restart_rhodecode                                                                                                                                                                                                                        
    echo                                                                                                                                                                                                                                     
    ;;
  *)                                                                                                                                                                                                                                         
    echo $"Usage: $0 {start|stop|restart}"                                                                                                                                                                                                   
    RETVAL=1                                                                                                                                                                                                                                 
    ;;                                                                                                                                                                                                                                       
esac                                                                                                                                                                                                                                         

exit $RETVAL

Cuando ejecuto sudo /etc/init.d/rhodecode-server starty luego ejecuto ps -aux | grep paster, puedo ver que el paster serve production.inicomando de /srv/rhodecode/start.sh se ejecutó y se está ejecutando con la identificación de usuario de rhodecode (102).

102       5222  0.7  7.8 144300 80988 ?        Sl   16:08   0:00 /opt/python_virtualenvironments/rhodecode-venv/bin/python /opt/python_virtualenvironments/rhodecode-venv/bin/paster serve production.ini

Sin embargo, no se crea ningún archivo pid, por lo que no puedo detener el servidor desde mi script de inicio. No estoy seguro de por qué Daemon no está creando el archivo pid. La ruta al archivo pid es válida y los permisos son correctos. Pensamientos?

Lester Peabody
fuente
@mailq He actualizado mi pregunta. Por alguna razón, la mitad de la publicación se había truncado ... La pregunta es por qué el demonio no crea un archivo pid.
Lester Peabody
¿Es /var/run/rhodecode/pidcorrecto el permiso para el usuario con el que se está ejecutando? Para el caso, ¿es correcta esa variable o debería serla /var/run/rhodecode.pid?
John Gardeniers
@John He agregado una sección de permisos a mi publicación para enumerar los permisos en todos los directorios y archivos involucrados en este proceso (que yo sepa).
Lester Peabody
Por favor, incluya su información de depuración sh -x /etc/init.d/rhodecode-server start?
quanta
daemon --pidfilesolo especifica dónde está el archivo pid. funciones en CentOS no parece tener la --make-pidfileopción requerida
KCD

Respuestas:

1

Creo que tu problema está en /srv/rhodecode/start.sh. Actualmente está comenzando pastercomo un proceso de fondo separado y luego saliendo inmediatamente. Esto plantea un problema para su script de inicio, que espera start.shser el proceso de demonio de larga ejecución que se administrará.

Por lo tanto, intente cambiar la última línea de /srv/rhodecode/start.shleer de la siguiente manera:

exec paster serve production.ini 1> debug.log 2> error.log

Uso de execlas marcas start.sh se convierten paster , que luego se endemoniada por el daemoncomando en el script de inicio.

Steven Monday
fuente
En mi mente, sabía que este era exactamente el problema, simplemente no tenía idea de qué buscar. Traté de paster con y sin el & y obviamente las dos veces no tuve resultados. Desafortunadamente, acabo de llegar a casa desde la oficina, implementaré esto a primera hora de la mañana.
Lester Peabody
De hecho, solo ingresé SSHd y lo probé y tampoco funcionó ... continúa colgando, actualizaré mi publicación.
Lester Peabody
0

¿Tienes que especificar la ubicación? ¿Podrías usar la opción --name para darle un nombre? Eso creará el PID para usted y lo limpiará cuando haya terminado. Entonces se vería así:

$NAME="rhodecode"
start_rhodecode () {                                                                                                                                                                                                                         
    daemon --user $USER --name $NAME $CMD                                                                                                                                                                                        
    RETVAL=$?                                                                                                                                                                                                                                
    return $RETVAL                                                                                                                                                                                                                           
} 

stop_rhodecode () {                                                                                                                                                                                                                          
    daemon --name $NAME --stop                                                                                                                                                           
    RETVAL=&?                                                                                                                                                                                                                                                                                                         
    return $RETVAL                                                                                                                                                                                                                           
}     
Jeffery Smith
fuente
No hay opción como '--stop' o --name en Centos 6.5
MariuszS
No hay --nameo --stopen Centos 5 tampoco.
Jim Mitchener