【问题标题】:How to gracefullly close subprocesses如何优雅地关闭子进程
【发布时间】:2021-04-16 02:43:31
【问题描述】:

我是信号/操作系统的新手,所以请多多包涵。

我的任务是优雅地掌握子流程。 假设转换器是由 systemd 运行的服务。 当我通过sudo systemctl restart xyz@9090.service 重新启动服务时,我得到了以下输出跟踪,它看起来像子进程的内存地址。请你能帮我理解我怎样才能优雅地退出这个。

有关该计划的更多信息。 (主程序 -> 一个服务(TCPServer)作为线程运行 -> 几个池池(多处理池)(KINDA 自定义编写) 堆栈跟踪的输出附在此处。

Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 4  ScalableBloomFilter::which_iter(char const*)
Apr 15 22:34:31 ip-5555-5553 transform_kafka.py[2963]: 5  ScalableBloomFilter::contains(char const*)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 6  /usr/local/lib/python2.7/dist-packages/scalablebloomfilter.so(+0x3e97)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 0  Utilities::logTrace(unsigned int, int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 7  /usr/bin/python(PyEval_EvalFrameEx+0x56a)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 1  QuitHandler::quit(int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 8  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 9  /usr/bin/python(PyEval_EvalFrameEx+0x5c6c)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2  /lib/x86_64-linux-gnu/libc.so.6(+0x3f040)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 10  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 3  /usr/bin/python(+0xcdae2)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 11  /usr/bin/python(PyEval_EvalFrameEx+0x5c6c)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 4  /usr/bin/python(PyDict_GetItem+0xa1)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 12  /usr/bin/python(PyEval_EvalFrameEx+0x52f6)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 5  /usr/bin/python(PyDict_GetItemString+0x24)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 13  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 6  /usr/bin/python(+0xde26f)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2021-04-15 22:34:31        CRITICAL         Common.cpp:logTrace():170        14  /usr/bin/python(PyEval_EvalFrameEx+0x569e)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2021-04-15 22:34:31        CRITICAL         Common.cpp:logTrace():170        Obtained 20 stack frames.
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 7  /usr/bin/python(PyArg_ParseTupleAndKeywords+0x10b)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 15  /usr/bin/python(PyEval_EvalFrameEx+0x52f6)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: Obtained 20 stack frames.
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 8  /usr/local/lib/python2.7/dist-packages/simplejson/_speedups.so(+0x8acf)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 16  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2021-04-15 22:34:31        CRITICAL         Common.cpp:logTrace():170        Obtained 20 stack frames.
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 9  /usr/bin/python(PyEval_EvalFrameEx+0x54f0)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 17  /usr/bin/python(+0x10de6c)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 0  Utilities::logTrace(unsigned int, int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 10  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 18  /usr/bin/python(PyObject_Call+0x3e)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 0  Utilities::logTrace(unsigned int, int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 1  QuitHandler::quit(int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 0  Utilities::logTrace(unsigned int, int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2021-04-15 22:34:31        CRITICAL         Common.cpp:logTrace():170        11  /usr/bin/python(PyEval_EvalFrameEx+0x569e)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 19  /usr/bin/python(PyEval_EvalFrameEx+0x26b7)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2021-04-15 22:34:31        CRITICAL         Common.cpp:logTrace():170        Obtained 20 stack frames.
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 1  QuitHandler::quit(int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2  /lib/x86_64-linux-gnu/libc.so.6(+0x3f040)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 1  QuitHandler::quit(int)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 12  /usr/bin/python(PyEval_EvalCodeEx+0x4ba)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: Obtained 20 stack frames.
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2  /lib/x86_64-linux-gnu/libc.so.6(+0x3f040)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 2  /lib/x86_64-linux-gnu/libc.so.6(+0x3f040)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 13  /usr/bin/python(PyEval_EvalFrameEx+0x569e)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 3  BloomFilter::insert(char const*)
Apr 15 22:34:31 ip-5555-555 transform_kafka.py[2963]: 0  Utilities::logTrace(unsigned int, 

目前我们有类似的东西 signal.signal(signal.SIGTERM, lambda _signal, _frame: x.stop())

def stop(self):
        """Stop running"""
        self.logger.info("Stopping %s", self)
        self.__running = False
        self.consumer.close()
        self.producer.flush()
        self.__pool.terminate()

【问题讨论】:

    标签: python operating-system multiprocessing signals systemd


    【解决方案1】:

    我们还需要在池初始化程序中添加子进程的信号处理程序。

    def init_stuff():
        signal.signal(signal.SIGTERM, signal.SIG_IGN)
    
    
    p = multiprocessing.Pool(initializer=init_stuff)
    
    

    现在,当我们终止主线程时,SIGTERM 被发送到子进程

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2010-11-13
      • 2016-10-20
      • 2014-12-01
      • 2014-11-03
      • 1970-01-01
      • 2013-01-04
      相关资源
      最近更新 更多