Python/Daemon

提供:やる気向上作戦
移動: 案内, 検索

Python


daemon

  1. fork()して親プロセスは終了。
  2. setsid()で制御端末を切り離す。
  3. fork()して親プロセスは終了。この時点で孫プロセスの親はinitになり、ゾンビを生じなくなる。
  4. プロセスIDをファイルに書く。
  5. ルートディレクトリにcdする。
  6. umask(0)してファイル作成モードをリセットする。
  7. stdin, stdout, stderrのファイル記述子を閉じる。
import os
import sys
 
def daemonize(pidfile, daemonfunc, *args):
try:
pid = os.fork()
if (pid > 0):
sys.exit(0)
except OSError:
print >>sys.stderr, 'daemonize: fork #1 failed.'
sys.exit(1)
 
try:
os.setsid()
except:
print >>sys.stderr, 'daemonize: setsid failed.'
sys.exit(1)
 
try:
pid = os.fork()
if (pid > 0):
sys.exit(0)
except OSError:
print >>sys.stderr, 'daemonize: fork #2 failed.'
sys.exit(1)
 
try:
f = file(pidfile, 'w')
f.write('%d' % os.getpid())
f.close()
except IOError:
print >>sys.stderr, 'daemonize: failed to write pid to %s' % pidfile
sys.exit(1)
 
# Now I'm a daemon.
try:
os.chdir('/')
os.umask(0)
sys.stdin.close(); sys.stdin = None
sys.stdout.close(); sys.stdout = None
sys.stderr.close(); sys.stderr = None
os.close(0)
os.close(1)
os.close(2)
except:
pass
 
daemonfunc(*args)
個人用ツール