2011-10-18 13 views
7

He visto muchas secuencias de comandos para demonizar una secuencia de comandos python en Linux, pero no mucha información sobre cómo usarlas. ¿Alguien podría guiarme en esto?Demonización de una secuencia de comandos python en debian mediante virtualenv

Actualmente tengo un script de Python largo que escucha en un socket un mensaje entrante, si es el formato correcto lo acepta y luego lo almacena en la base de datos. El script en sí mismo solo abre el socket y luego escucha en un momento true (¡que hace el trabajo!) Y hace todo el trabajo allí.

Para demonizarlo, ¿tendría que modificar mi script actual o llamarlo desde un script separado? He visto ejemplos de ambos pero ninguno de los dos funciona.

Además, estoy usando virtualenv, que podría ser la raíz de mis problemas, ¿alguna pista sobre el uso de este con scripts daemonizados?

+0

un daemon es simplemente un programa/script que se ejecuta constantemente hasta que ocurre un evento y si no ocurre ningún evento (o está en cola), dormirá por un período de tiempo ... luego lo repetirá ... What lo que estás haciendo es lo que hace un daemon. ¿Estás pidiendo que lo inicies con el entorno para que siempre esté funcionando? – g19fanatic

+0

Necesito varias cosas que están instaladas en virtualenv para ser usadas por el script. Creo que esta es la razón por la que todavía no lo tengo funcionando. Además, ¿cómo sé que se está ejecutando? He leído acerca de llamar a 'ps aux' para mostrar una lista, pero no puedo verla allí. –

Respuesta

5

Cree un shell-script que active el entorno virtual y ejecute el script de Python en segundo plano.

Además, debe existir un módulo de python en el entorno virtual desde el que pueda importar y activar el entorno. No tengo virtualenv funcionando en este momento, así que no puedo verificar dónde está, pero busque activate (o algo similar) en el entorno virtual y debería encontrarlo.

Editar: Se ha añadido un guión init.d Debian mínimo

El guión mínima absoluta necesaria para iniciar un demonio cuando se inicia el equipo, es la siguiente:

#!/bin/sh 
/path/to/program & 

El & hace que el programa se ejecute en segundo plano, por lo que no detendrá el resto del proceso de arranque.

Para obtener una secuencia de comandos más completa, copie /etc/init.d/skeleton y edite el archivo nuevo. La parte importante para editar es el bloque al principio (entre ### BEGIN INIT INFO y ### END INIT INFO, que es utilizado por el programa update-rc.d), y las variables NAME, DAEMON y DAEMON_ARGS. Con suerte, eso debería ser todo lo que se necesita para hacer un script de inicio.

Activar el script como este:

sudo update-rc.d <name of script> defaults 
sudo update-rc.d <name of script> enable 

Y para iniciarlo:

sudo update-rc.d <name of script> start 

El <name of script> es sólo el nombre, no la ruta completa.

+0

Tengo el archivo de activación sí, ¿entonces escribo un script bash? ¿Cómo lo demonizo? –

+0

@ ing0: ¿Quizás quiera decir cómo escribir un script que se inicia cuando la computadora arranca, como todos los otros programas en /etc/init.d? Entonces depende un poco de la distribución de Linux que use. Pruebe 'man update-rc.d', si la página del manual existe, debe contener punteros sobre cómo hacerlo. Pruebe también google para 'script de inicio _linuxdist_'. –

+0

Actualmente, utilizando una variante de Debian, todo lo que he encontrado en línea proporciona un código como este: http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/ ¿Es este tipo? de código no requerido? –

5
script 
    export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/ 
    exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 & 
end script 

Cuando tenga que ejecutar una aplicación en un virtualenv pitón, usted puede Activar el virtualenv, o utilizar único comando de ese ambiente python.

Según el sitio web "Si ejecuta directamente un script o el intérprete de python del bin/directorio de virtualenv (por ejemplo, path/to/env/bin/pip o/path/to/env/bin/python script.py) no hay necesidad de activación ". - http://pypi.python.org/pypi/virtualenv

También tengo algunos módulos de python compilados desde la fuente. Esos deben estar en la variable de entorno PYTHONPATH.Eso podría ser parte de su activación virtualenv, hecho con virtualwrapper, o explícitamente llamado (como hago abajo).

También funciona llamar al programa desde un trabajo UPSTART. Mi ejemplo está arriba.

En una instancia de Ubuntu 10.10 en Amazon EC2, tuve mejor suerte con el comando start-stop-daemon. También tuve problemas con algunas de las otras 'estrofas' advenedizas. Estoy llamando a una aplicación de Python con un virtualenv específico y algunos parámetros para mi programa ejecutado.

+0

¿Tiene algún script de ejemplo (shell y/o python) que funcione con upstart? Usted menciona "el ejemplo está abajo". – hobs

Cuestiones relacionadas