-
Notifications
You must be signed in to change notification settings - Fork 0
/
daemon.py
executable file
·121 lines (104 loc) · 2.81 KB
/
daemon.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#-*-coding:utf-8-*-
#作者:guicheng.liao
import sys
import os
import time
import atexit
import string
import signal
class cDaemon(object):
def __init__(self,pidfile,stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'):
self.stdin=stdin
self.stdout=stdout
self.stderr=stderr
self.pidfile=pidfile
def _daemonize(self):
try:
pid=os.fork()
if pid>0:
sys.exit(0)
except OSError,e:
sys.stderr.write('fork #1 failed: %d(%s)\n' % (e.errno,e.strerror))
sys.exit(1)
sys.stdout.flush()
sys.stderr.flush()
si=file(self.stdin,'r')
so=file(self.stdout,'a+')
se=file(self.stderr,'a+',0)
os.dup2(si.fileno(),sys.stdin.fileno())
os.dup2(so.fileno(),sys.stdout.fileno())
os.dup2(se.fileno(),sys.stderr.fileno())
#创建processid文件
atexit.register(self.delpid)
pid=str(os.getpid())
fp=file(self.pidfile,'w+')
fp.write('%s\n' % pid)
fp.close()
def delpid(self):
os.remove(self.pidfile)
def start(self):
try:
pf=file(self.pidfile,'r')
pid=int(pf.read().strip())
pf.close()
except IOError:
pid=None
if pid:
message='pidfile %s already exit. Daemon already running?\n'
sys.stderr.write(message % self.pidfile)
sys.exit(1)
#启动监控
self._daemonize()
self._run()
def stop(self):
try:
pf=file(self.pidfile,'r')
pid=int(pf.read().strip())
pf.close()
except IOError:
pid=None
if pid:
try:
while True:
os.kill(pid, signal.SIGTERM)
time.sleep(0.1)
#os.system('echo "你想停止的程序"')
except OSError,err:
err=str(err)
if err.find('No such process') > 0:
if os.path.exists(self.pidfile):
os.remove(self.pidfile)
# lSvPid=os.popen('ps -ef | grep "python" | grep -v "grep" | grep -v daemon.py | grep "mainServer" | awk \'{print $2}\'').read().strip().split('\n')
# if not lSvPid or not lSvPid[0]:
# return
# try:#杀死python main.py mainServer
# while True:
# os.kill(lSvPid[0], signal.SIGTERM)
# time.sleep(0.1)
# #os.system('echo "你想停止的程序"')
# except OSError,err:
# pass
def restart(self):
self.stop()
self.start()
def _run(self):
while True:
apollo=os.popen('ps -ef | grep "python" | grep "main.py" | grep "sceneService" | grep -v "grep" | wc -l').read().strip()
if apollo=='0':
os.system('nohup python logic/main.py sceneService > /dev/null 2>&1 &')
time.sleep(2)
if __name__=='__main__':
daemon=cDaemon('watch_process.pid')
if len(sys.argv)==2:
if 'start'==sys.argv[1]:
daemon.start()
elif 'stop'==sys.argv[1]:
daemon.stop()
elif 'restart'==sys.argv[1]:
daemon.restart()
else:
print 'Unknown command'
sys.exit(2)
else:
print 'usage: %s start|stop|resart' % sys.argv[0]
sys.exit(2)