2010-06-04 14 views

Respuesta

129

Ejecute nohup python bgservice.py & para obtener la secuencia de comandos para ignorar la señal de interrupción y seguir funcionando. La salida se pondrá en nohup.out.

Idealmente, ejecutaría su script con algo como supervise para que pueda reiniciarse si (cuando) muere.

+5

cuando ejecuto el comando con nohup y &, obtengo el mensaje 'nohup: ignorando en y agrego salida a' nohup.out'' y cuando presiono enter el proceso sale con estado 1. ¿Qué está pasando? –

+1

lea la salida en nohup.out. en mi caso, era un problema de permisos, necesitaba usar sudo – mxns

+0

y cómo detener el servicio bgs luego de ejecutarlo en este método? – Shaegorath

5

No se puede, pero prefiero screen.

15

También podría usar GNU screen que debería tener casi cualquier sistema Linux/Unix.

Si está en Ubuntu/Debian, su variante mejorada byobu es bastante agradable también.

+0

Gracias, me alegraron el día: aparentemente lo mejor desde que se mejoró el pan rebanado. –

+0

Esa es exactamente la misma definición que uso también :) Entonces, ¿cómo llamamos eso? ¿Pan en rebanadas y tostado? ;-) –

+0

rebanado, tostado y luego frito en la mezcla de cerveza. – DataMania

3

El shell zsh tiene una opción para que todos los procesos en segundo plano se ejecuten con nohup.

En ~/.zshrc añadir las líneas:

setopt nocheckjobs #don't warn about bg processes on exit 
setopt nohup  #don't kill bg processes on exit 

Entonces sólo tiene que ejecutar un proceso de esta manera: python bgservice.py &, y ya no es necesario utilizar el comando nohup.

Sé que no mucha gente usa zsh, pero es una carcasa realmente genial que yo recomendaría.

18

Si ya ha comenzado el proceso, y no desea eliminarlo y reiniciarlo bajo nohup, puede enviarlo a un segundo plano, y luego rechazarlo.

Ctrl+Z (suspender el proceso)

bg (reiniciar el proceso en segundo plano

disown %1 (suponiendo que esto es el trabajo # 1, utilice jobs determinar)

9

usted podría considerar convertir su pitón secuencia de comandos en un daemon de python adecuado, como se describe here.

python-daemon es una buena herramienta que puede ser u sed para ejecutar scripts de Python como un proceso de daemon de fondo en lugar de un script que se ejecuta para siempre. Deberá modificar un poco el código existente, pero es simple y simple.

Si tiene problemas con python-daemon, existe otra utilidad supervisor que hará lo mismo por usted, pero en este caso no tendrá que escribir ningún código (o modificar el existente) ya que es un solución de caja para procesos de demonización.

+0

dando una breve explicación sobre cómo se puede resolver el problema generalmente es una buena idea. –

0

Si lo que necesita es que el proceso se ejecute para siempre, independientemente de si ha iniciado sesión o no, considere ejecutar el proceso como daemon.

es una gran solución lista para usar que se puede utilizar para demonizar cualquier proceso. Tiene otra utilidad de control supervisorctl que se puede usar para monitorear procesos que están siendo ejecutados por el supervisor.

No tiene que escribir ningún código adicional ni modificar scripts existentes para que esto funcione. Además, la documentación detallada hace que este proceso sea mucho más simple.

Después de rascarme la cabeza durante horas alrededor de python-daemon, el supervisor es la solución que me funcionó en minutos.

Espero que esto ayude a alguien tratando de hacer el trabajo de pitón-daemon

3

Aquí es una solución sencilla dentro de Python usando un decorador:

import os, time 

def daemon(func): 
    def wrapper(*args, **kwargs): 
     if os.fork(): return 
     func(*args, **kwargs) 
     os._exit(os.EX_OK) 
    return wrapper 

@daemon 
def my_func(count=10):  
    for i in range(0,count): 
    print('parent pid: %d' % os.getppid()) 
    time.sleep(1) 


my_func(count=10) 
#still in parent thread 
time.sleep(2) 
#after 2 seconds the function my_func lives on is own 

Por supuesto, puede reemplazar el contenido de su archivo bgservice.py en su sitio de my_func.

+0

Quizás sea necesario atrapar la señal SIGHUP. A continuación, agregue signal.signal (signal.SIGHUP, handler) en su bloque. – Chouettou

+0

Muy lindo decorador. Trabajó maravillosamente para mí. – Klik

Cuestiones relacionadas