我想用 process 类记录进程的 id,写入文件 然后用使用 process 类的 close 方法关闭进程
问题是使用 kill pid 的时候,process 类的析构方法不能正常执行析构方法删除掉对应的 pid 文件
加上 signal.signal(signal.SIGTERM, self.signal_handler),即使 handler 中不写任何东西,被 kill 的进程也能调用析构方法
如果不写 signal.signal,析构方法就不会触发,求指教
python 版本为 2.7.6
# coding=utf-8
# from tool import Tool
import os
import signal
import re
class Process:
_pid = None
_pid_dir = None
prefix = 'pid.'
def __init__(self):
t = Tool()
self._pid_dir = t.runtime_dir() # 创建临时目录而已,可手动写死
signal.signal(signal.SIGTERM, self.signal_handler)
def signal_handler(self, signum, frame):
# print('Received signal: ', signum)
pass
def pid_file_name(self, pid):
return self.prefix + str(pid)
def pid_file(self, pid):
"""
获取当前进程的 pid 缓存文件
:return:
"""
return self._pid_dir + '/' + self.pid_file_name(pid)
def save(self, pid=None):
"""
保存当前进程 pid 文件
:return:
"""
self._pid = pid if pid else os.getpid()
os.system('touch %s' % self.pid_file(self._pid))
def close(self):
"""
关闭全部的进程
:return:
"""
for pf in os.listdir(self._pid_dir):
rer = re.match(self.prefix + '(\d+)', pf)
if rer:
pid = int(rer.group(1))
try:
os.kill(pid, 15)
except OSError:
# 抑制异常,不抛出进程不存在的问题,并删除不存在的进程号
self.del_pid_file(pid)
def del_pid_file(self, pid):
"""
删除进程缓存的文件
:param pid:
:return:
"""
pid_file = self.pid_file(pid)
os.path.exists(pid_file) and os.remove(pid_file)
def __del__(self):
"""
如果存在当前进程的 pid 文件,删除 pid 文件
:return:
"""
self._pid and self.del_pid_file(self._pid)
使用 python tester.py xx 和 python tester.py 命令进行对应的调试
import sys
import time
from core.Process import Process
import datetime
p = Process()
m = True if len(sys.argv) == 2 else False
# m = False
if m:
p.save()
time.sleep(70)
else:
p.close()
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.