Quel serait le moyen le plus simple de démoniser un script python sous Linux?
Question
Quel serait le moyen le plus simple de démoniser un script python sous Linux? J'ai besoin que cela fonctionne avec toutes les versions de Linux, il ne devrait donc utiliser que des outils basés sur Python.
La solution
Voir Stevens et également ceci long fil sur activestate que j'ai personnellement jugé à la fois incorrect et extrêmement verbeux, et j'ai trouvé ceci:
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 vous devez arrêter ce processus à nouveau, il est nécessaire de connaître le pid, la solution habituelle étant pidfiles. Faites ceci si vous en avez besoin
from os import getpid
outfile = open(pid_file, 'w')
outfile.write('%i' % getpid())
outfile.close()
Pour des raisons de sécurité, vous pouvez envisager l'une de ces solutions après avoir diabolisé
.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('/')
Vous pouvez également utiliser nohup , mais cela ne fonctionne pas correctement avec module de sous-processus de python
Autres conseils
J'ai récemment utilisé 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)
Si vous ne vous souciez pas des discussions réelles (qui ont tendance à se dérouler de manière décalée et n’offrent pas de réponse faisant autorité), vous pouvez choisir une bibliothèque qui facilitera votre goût. Je vous conseillerais de consulter ll-xist , cette bibliothèque contient une grande quantité de Un code qui sauve des vies, tel que cron jobs helper, framework daemon et (ce qui ne vous intéresse pas, mais qui est vraiment formidable) XSL orienté objet (ll-xist lui-même).
Utilisez grizzled.os.daemonize :
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
Pour comprendre comment cela fonctionne ou le faire vous-même, lisez la discussion sur ActiveState . .