interprete - idle python
¿Cuál sería la forma más simple de demonizar una secuencia de comandos python en Linux? (5)
Si no le importan los debates reales (que tienden a ser extraoficiales y no ofrecen una respuesta autorizada), puede elegir alguna biblioteca que le facilite la tarea. Recomiendo echar un vistazo a ll-xist , esta biblioteca contiene una gran cantidad de código de salvamento, como cron jobs helper, daemon framework y (lo que no es interesante para ti, pero es realmente genial) XSL orientado a objetos ( ll-xist sí mismo).
¿Cuál sería la forma más simple de demonizar una secuencia de comandos python en Linux? Necesito que esto funcione con todos los sabores de Linux, por lo que solo debería usar herramientas basadas en Python.
Use grizzled.os.daemonize :
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
Para entender cómo funciona esto o hacerlo usted mismo, lea la discusión en ActiveState .
Vea a Stevens y también este extenso hilo en el estado activo, que me pareció personalmente incorrecto y muy verboso, y se me ocurrió esto:
from os import fork, setsid, umask, dup2
from sys import stdin, stdout, stderr
if fork(): exit(0)
umask(0)
setsid()
if fork(): exit(0)
stdout.flush()
stderr.flush()
si = file(''/dev/null'', ''r'')
so = file(''/dev/null'', ''a+'')
se = file(''/dev/null'', ''a+'', 0)
dup2(si.fileno(), stdin.fileno())
dup2(so.fileno(), stdout.fileno())
dup2(se.fileno(), stderr.fileno())
Si necesita detener ese proceso nuevamente, se requiere conocer el pid, la solución habitual para esto es pidfiles. Haz esto si necesitas uno
from os import getpid
outfile = open(pid_file, ''w'')
outfile.write(''%i'' % getpid())
outfile.close()
Por razones de seguridad, puede considerar cualquiera de estos después de demonizar
from os import setuid, setgid, chdir
from pwd import getpwnam
from grp import getgrnam
setuid(getpwnam(''someuser'').pw_uid)
setgid(getgrnam(''somegroup'').gr_gid)
chdir(''/'')
También podría usar nohup pero eso no funciona bien con el módulo de subproceso de python
Recientemente utilicé Turkmenbashi :
$ easy_install turkmenbashi
import Turkmenbashi
class DebugDaemon (Turkmenbashi.Daemon):
def config(self):
self.debugging = True
def go(self):
self.debug(''a debug message'')
self.info(''an info message'')
self.warn(''a warning message'')
self.error(''an error message'')
self.critical(''a critical message'')
if __name__=="__main__":
d = DebugDaemon()
d.config()
d.setenv(30, ''/var/run/daemon.pid'', ''/tmp'', None)
d.start(d.go)