Estoy usando el siguiente comando para ejecutar un script de Python en segundo plano:
nohup ./cmd.py > cmd.log &
Pero parece que nohup no está escribiendo nada en el archivo de registro. cmd.log se crea pero siempre está vacío. En el script de Python, estoy usando en sys.stdout.write
lugar de print
imprimir en la salida estándar. ¿Estoy haciendo algo mal?
nohup
estás usando? La versión BSD escribe en un archivo llamadonohup.out
en el directorio actual (o$HOME/nohup.out
si el directorio actual no se puede escribir). No veo una manera de cambiar el nombre del archivo de salida ...Respuestas:
Parece que necesita enjuagar stdout periódicamente (por ejemplo
sys.stdout.flush()
). En mis pruebas, Python no hace esto automáticamente inclusoprint
hasta que se cierra el programa.fuente
python -u
no funciona;nohup
podría haber introducido su propio almacenamiento en búfer.nohup
no amortigua la salida ypython -u
funciona bien. (solo una actualización para personas)nohup
es una utilidad POSIX, podría haber diferentes implementaciones en diferentes plataformas. Por cierto, python3 I / O ya no está basado en C stdio, pero tiene un comportamiento de almacenamiento en búfer similar.Puede ejecutar Python con el
-u
indicador para evitar el almacenamiento en búfer de salida:fuente
Usando
-u
connohup
trabajado para mí. Usando-u
obligará alstdout
,stderr
arroyos ser sin búfer. No afectará a stdin. Todo se guardará en el archivo " nohup.out ". Me gusta esto-También puede guardarlo en su directorio. De esta manera-
Además, puedes usar
PYTHONUNBUFFERED
. Si lo configura en una cadena no vacía, funcionará igual que la-u
opción. Para usar esto, ejecute los siguientes comandos antes de ejecutar el código python.o
PD : sugeriré usar herramientas como cron-job para ejecutar cosas en segundo plano y la ejecución programada.
fuente
o
https://docs.python.org/2/using/cmdline.html#cmdoption-u
fuente
Python 3.3 y superior tiene un argumento de descarga para imprimir y este es el único método que funcionó para mí.
fuente
Tuve un problema similar, pero no estaba conectado con un proceso de Python. Estaba ejecutando un script que hacía un nohup y el script se ejecutaba periódicamente a través de cron.
Pude resolver el problema:
PD: mis scripts fueron escritos en ksh ejecutándose en RHEL
fuente