Ejecutando Python en segundo plano en OS X

¿Hay alguna manera de mantener mi script de Python (con un bucle interminable ‘while’) ejecutándose en segundo plano en OS X? Además, para el mismo propósito, ¿hay alguna forma de tener un script de python “autoejecutable” en una unidad USB?

Si desea que el script se ejecute como un proceso de daemon que se inicie automáticamente, puede usar launchctl y un archivo plist.

Por ejemplo, Bob tiene un simple script de Python que escribe la palabra ‘foo’ en un archivo cada segundo en su directorio de inicio:

 #!/usr/bin/env python import os import time while True: os.system('echo " foo" >> /Users/bob/foostore.txt') time.sleep(1) 

Para que se ejecute como un proceso de daemon, cree un archivo plist, ~/Library/LaunchAgents/com.bobbob.osx.test.plist , con el contenido:

     Label com.bobbob.osx.test Program /Users/bob/pyfoo.py KeepAlive    

Luego use launchctl para cargar el plist desde un terminal:

 launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist 

Esto cargará ese script y ejecutará inmediatamente el progtwig en el elemento debajo de Program . También puede especificar argumentos para el progtwig utilizando un nodo con una matriz de elementos . Para más información vea la página de manual de launchd.plist

Si desea eliminar el script, puede usar el comando de descarga de launchctl :

 launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist 

La etiqueta utilizada en el script puede ser cualquier cosa, pero debe ser única en su sistema, por lo que Apple generalmente usa un nombre de dominio invertido.

En cuanto a la ejecución automática de un script, no creo que haya ninguna manera de hacerlo.

Vea esta pregunta para conocer las formas de demonizar los scripts de Python en los sistemas Unix: Python Daemon Packaging Best Practices

Por supuesto, siempre puede ejecutar la secuencia de comandos en segundo plano como lo menciona Kindall si eso es todo lo que necesita.

Simplemente ejecute el script Python en segundo plano usando el shell de la forma habitual:

 python myscript.py & 

En cuanto a la pregunta de ejecución automática, este sería un gran agujero de seguridad si se tratara de algo que Mac OS X hizo de forma predeterminada, así que no, por supuesto que no. Pero podría escribir fácilmente un script que implementara algo así a propósito: buscar periódicamente una unidad USB conectada y hacer algo (incluso ejecutar un segundo script desde la unidad de memoria) cuando está conectado.

Intenté launchctl y no pude hacer que funcionara en El Capitán, busqué un poco más y encontré esta publicación

TL; DR

Use la línea shebang #!/usr/bin/env python o #!/path/to/python en su script

 chmod +x test.py nohup /path/to/test.py & ps ax | grep test.py 

Puede utilizar nohup https://linux.die.net/man/1/nohup

 $ nohup python  & 

Esto ejecutará su proceso y agregará la salida a un archivo nohup.out en el mismo directorio. y ejecutará el script en segundo plano como se explica en otras respuestas.