Python 进程 pid,使用 kill -15 pid,无法执行析构函数,求解释为什么

2018-06-19 11:27:04 +08:00
 ruoge3s

我想用 process 类记录进程的 id,写入文件 然后用使用 process 类的 close 方法关闭进程

问题是使用 kill pid 的时候,process 类的析构方法不能正常执行析构方法删除掉对应的 pid 文件

加上 signal.signal(signal.SIGTERM, self.signal_handler),即使 handler 中不写任何东西,被 kill 的进程也能调用析构方法

如果不写 signal.signal,析构方法就不会触发,求指教

python 版本为 2.7.6

Process.py

# 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 命令进行对应的调试

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()
4186 次点击
所在节点    Python
22 条回复
ryd994
2018-06-20 03:01:39 +08:00
@msg7086
@sNullp
看来是我记错了,抱歉
ruoge3s
2018-06-20 09:56:49 +08:00
@geelaw 受教了,我去多读读 python 的关于这点的文档

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/464039

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX