equal
deleted
inserted
replaced
|
1 def synchronized(lock): |
|
2 """ Synchronization decorator. """ |
|
3 |
|
4 def wrap(f): |
|
5 def newFunction(*args, **kw): |
|
6 lock.acquire() |
|
7 try: |
|
8 return f(*args, **kw) |
|
9 finally: |
|
10 lock.release() |
|
11 return newFunction |
|
12 return wrap |
|
13 |
|
14 import sys, os |
|
15 |
|
16 def daemonize(stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): |
|
17 |
|
18 # Perform first fork. |
|
19 try: |
|
20 pid = os.fork() |
|
21 if pid > 0: |
|
22 sys.exit(0) # Exit first parent. |
|
23 except OSError, e: |
|
24 sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror)) |
|
25 sys.exit(1) |
|
26 |
|
27 # Decouple from parent environment. |
|
28 os.chdir("/") |
|
29 os.umask(0) |
|
30 os.setsid() |
|
31 |
|
32 # Perform second fork. |
|
33 try: |
|
34 pid = os.fork() |
|
35 if pid > 0: |
|
36 sys.exit(0) # Exit second parent. |
|
37 except OSError, e: |
|
38 sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror)) |
|
39 sys.exit(1) |
|
40 |
|
41 # The process is now daemonized, redirect standard file descriptors. |
|
42 for f in sys.stdout, sys.stderr: f.flush() |
|
43 si = file(stdin, 'r') |
|
44 so = file(stdout, 'a+') |
|
45 se = file(stderr, 'a+', 0) |
|
46 os.dup2(si.fileno(), sys.stdin.fileno()) |
|
47 os.dup2(so.fileno(), sys.stdout.fileno()) |
|
48 os.dup2(se.fileno(), sys.stderr.fileno()) |