我想用 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() 