Respuestas:
Ejecutar nohup python bgservice.py &
para que el script ignore la señal de colgar y siga funcionando. La salida se incluirá nohup.out
.
Idealmente, ejecutaría su script con algo como supervise
para que pueda reiniciarse si (cuando) muere.
somecommand &
, imprimirá el pid como [1] 12345
. de lo contrario, puede usar $!
.
También puede usar la pantalla GNU que casi todos los sistemas Linux / Unix deberían tener.
Si está en Ubuntu / Debian, su variante mejorada byobu también es bastante agradable.
Podría considerar convertir su script de Python en un demonio de Python adecuado, como se describe aquí .
Python-demonio es una buena herramienta que se puede usar para ejecutar scripts de Python como un proceso de demonio en segundo plano en lugar de un script de ejecución permanente. Necesitará modificar un poco el código existente, pero es simple y llanamente.
Si tiene problemas con python-daemon, hay otro supervisor de utilidad que hará lo mismo por usted, pero en este caso no tendrá que escribir ningún código (o modificar el existente) ya que esta es una solución lista para usar para demonizar Procesos.
No puedes hacerlo, pero prefiero la pantalla .
Aquí hay una solución simple 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 bgservice.py
archivo en lugar de my_func
.
El shell zsh tiene una opción para hacer que todos los procesos en segundo plano se ejecuten con nohup.
En ~/.zshrc
agregue las líneas:
setopt nocheckjobs #don't warn about bg processes on exit
setopt nohup #don't kill bg processes on exit
Entonces solo necesita ejecutar un proceso como este:, python bgservice.py &
y ya no necesita usar el comando nohup.
Sé que no mucha gente usa zsh, pero es un shell realmente genial que recomendaría.
Si lo que necesita es que el proceso se ejecute para siempre, sin importar si ha iniciado sesión o no, considere ejecutar el proceso como un demonio.
supervisord es una excelente solución lista para usar que se puede usar para demonizar cualquier proceso. Tiene otra utilidad controladorasupervisorctl
que puede usarse para monitorear los procesos que está ejecutando el supervisor.
No tiene que escribir ningún código adicional ni modificar los scripts existentes para que esto funcione. Además, la documentación detallada hace que este proceso sea mucho más sencillo.
Después de rascarme la cabeza durante horas con python-daemon, supervisor es la solución que funcionó para mí en minutos.
Espero que esto ayude a alguien que intente hacer que Python-daemon funcione
También puede utilizar Yapdi :
Uso básico:
import yapdi daemon = yapdi.Daemon() retcode = daemon.daemonize() # This would run in daemon mode; output is not visible if retcode == yapdi.OPERATION_SUCCESSFUL: print('Hello Daemon')
Prueba esto:
nohup python -u <your file name>.py >> <your log file>.log &
Puede ejecutar el comando anterior en la pantalla y salir de la pantalla.
Ahora puede rastrear los registros de su secuencia de comandos de Python mediante: tail -f <your log file>.log
Para matar su script, puede usar los comandos ps -aux y kill .
nohup: ignoring in put and appending output to
aparece el mensaje nohup.out'` y cuando presiono enter, el proceso sale con el estado 1. ¿Qué está pasando?