"""
Only can run in unix, because of module python-daemon==2.3.0
"""
import os
import signal
import sys
import time
import daemon
def get_engine_pid():
if os.path.exists('/root/test_while_dir/test_pid'):
with open('/root/test_while_dir/test_pid', 'r') as f:
pid = int(f.read())
return pid
return -1
class A:
def __init__(self):
self.is_stop = False
def handle_stop(self, signum, frame):
print("Got stop signal")
self.is_stop = True
def task(self):
log = open('/root/test_while_dir/daemon.log', 'a')
with daemon.DaemonContext(stdout=log, stderr=log):
os.system("echo %d > %s" % (os.getpid(), '/root/test_while_dir/test_pid'))
signal.signal(signal.SIGINT, self.handle_stop)
signal.signal(signal.SIGTERM, self.handle_stop)
signal.signal(signal.SIGQUIT, self.handle_stop)
while not self.is_stop:
print(time.time())
time.sleep(20)
print('killed success {}'.format(os.getpid()))
# os.kill(os.getpid(), signal.SIGTERM)
def stop(self):
print('stop')
self.is_stop = True
if __name__ == '__main__':
if not os.path.exists('/root/test_while_dir/'):
os.makedirs('/root/test_while_dir/')
if len(sys.argv) == 2:
print('kill {}'.format(get_engine_pid()))
pid = get_engine_pid()
if pid != -1:
os.kill(get_engine_pid(), signal.SIGTERM)
else:
a = A()
print(a.is_stop)
a.task()
time.sleep(5)
print(a.is_stop)
以上代码在python2,和python3中的运行会有不同结果:
python test_while.py
再执行:
python test_while.py stop
在python2中,日志daemon.log中会立刻输出:
Got stop signal
killed success 261843
True
但是在python3中,会等到time.sleep(20)
休眠20秒之后,再次进入while not self.is_stop
循环,发现self.is_stop已经为True了,才会输出:
Got stop signal
killed success 261843
True
原因待分析。