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.

Était-ce utile?

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 . .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top