|
0
|
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()) |