Linux で Python スクリプトをデーモン化する最も簡単な方法は何ですか? これは Linux のすべてのフレーバーで動作する必要があるため、Python ベースのツールのみを使用する必要があります。
5868 次
5 に答える
21
Stevensと、activestate に関するこの長いスレッドも参照してください。個人的には、ほとんどが正しくなく、冗長であることがわかったので、次のように思いつきました。
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())
そのプロセスを再度停止する必要がある場合は、pid を知る必要があります。これに対する通常の解決策は pidfiles です。必要な場合はこれを行います
from os import getpid
outfile = open(pid_file, 'w')
outfile.write('%i' % getpid())
outfile.close()
セキュリティ上の理由から、悪魔化した後にこれらのいずれかを検討することができます
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('/')
nohupを使用することもできますが、それはpython の subprocess モジュールではうまく機能しません
于 2008-09-22T16:47:31.380 に答える
4
于 2008-09-22T16:41:18.137 に答える
2
私は最近トルクメンバシを使用しました:
$ 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)
于 2010-08-31T05:43:08.863 に答える
1
実際の議論 (トピックから外れて、信頼できる応答を提供しない傾向がある) を気にしない場合は、好みを簡単にするライブラリを選択できます。ll-xistを参照することをお勧めします。このライブラリには、cron ジョブ ヘルパー、デーモン フレームワーク、(あなたにとって興味深いものではありませんが、本当に素晴らしい)オブジェクト指向の XSL ( ll-xist 自体)。
于 2008-09-22T19:58:20.313 に答える
0
grizzled.os.daemonizeを使用します。
$ easy_install grizzled
>>> from grizzled.os import daemonize
>>> daemon.daemonize()
これがどのように機能するかを理解するか、自分で行うには、 ActiveState に関する議論を読んでください。
于 2008-09-22T16:57:14.277 に答える