gpt4 book ai didi

multithreading - 当 child 被杀死时,防止线程 subprocess.popen 终止我的主脚本?

转载 作者:行者123 更新时间:2023-12-01 05:23:11 25 4
gpt4 key购买 nike

Solaris 10 上的 Python 2.7.3

问题

  • 当我的子进程有内部段错误(核心)问题或用户使用 SIGTERM 或 SIGKILL 从 shell 外部杀死它时,我的主程序的信号处理程序处理 SIGTERM(-15) 并且我的父程序退出。 这是真的吗?或者它是一个糟糕的python构建?

  • 背景和代码

    我有一个 python 脚本,它首先产生一个工作管理线程。 worker 管理线程然后产生一个或多个 worker 线程。我的主线程中还有其他无法阻止的事情。我的管理线程的东西和工作线程是坚如磐石的。我的服务运行多年而没有重新启动,但我们有这个 subprocess.Popen设想:

    在工作线程的运行方法中,我使用的是:
    class workerThread(threading.Thread):
    def __init__(self) :
    super(workerThread, self).__init__()
    ...
    def run(self)
    ...
    atempfile = tempfile.NamedTempFile(delete=False)

    myprocess = subprocess.Popen( ['third-party-cmd', 'with', 'arguments'], shell=False, stdin=subprocess.PIPE, stdout=atempfile, stderr=subprocess.STDOUT,close_fds=True)
    ...

    我需要使用 myprocess.poll()检查进程终止,因为我需要扫描 atempfile直到我找到相关信息(文件可能 > 1 GiB)并且由于用户请求或进程运行时间过长而需要终止进程。一旦我找到我要找的东西,我将停止检查标准输出临时文件。我会在外部进程死后和工作线程终止之前清理它。我需要标准输入管道,以防我需要对 child 标准输入流中的交互内容进行响应。

    在我的主程序中,我为我设置了一个 SIGINT 和 SIGTERM 处理程序来执行清理,如果我的主 python 程序以 SIGTERM 或 SIGINT(Ctrl-C) 终止(如果从 shell 运行)。

    有没有人有一个可靠的 2.x 方法来处理线程中的子信号处理?
    ctypes sigprocmask 等

    任何帮助将不胜感激。我只是在寻找“官方”食谱或 最佳黑客 ,如果一个甚至存在。

    备注

    我正在使用 Python 的受限版本。我必须使用 2.7.3。第三方 cmd 是我没有源的程序 - 修改它是不可能的。

    最佳答案

    你的描述中有很多看起来很奇怪的东西。首先,你有几个不同的线程和进程。谁在崩溃,谁在接收 SIGTERM,谁在接收 SIGKILL 以及由于哪些操作?

    第二:为什么你的 parent 会收到 SIGTERM ?它不能被隐式发送。有人直接或间接地向您的父进程调用 kill(例如,通过杀死整个父组)。

    第三点:当您处理 SIGTERM 时,您的程序如何终止?根据定义,如果未处理,程序将终止。如果已处理,则不会终止。到底发生了什么?

    建议:

        $ cat crsh.c
    #include <stdio.h>

    int main(void)
    {
    int *f = 0x0;

    puts("Crashing");
    *f = 0;
    puts("Crashed");
    return 0;
    }
    $ cat a.py

    import subprocess, sys

    print('begin')
    p = subprocess.Popen('./crsh')
    a = raw_input()
    print(a)
    p.wait()
    print('end')
    $ python a.py
    begin
    Crashing
    abcd
    abcd
    end

    这行得通。没有信号传递给父级。您是否在程序中隔离了问题?

    如果问题是发送到多个进程的信号:您可以使用 setpgid 为子进程设置单独的进程组吗?

    创建临时文件有什么理由吗?它是在您的临时目录中创建的 1 GB 文件。为什么不管道 stdout ?

    如果您确实确定需要在父程序中处理信号(例如,为什么不尝试/除了 KeyboardInterrupt?):多线程程序的 signal() 未指定行为是否会导致这些问题(例如,调度给不处理信号的线程的信号)?
    NOTES
    The effects of signal() in a multithreaded process are unspecified.

    无论如何,尝试更准确地解释程序的线程和进程是什么,它们做什么,信号处理程序是如何设置的以及为什么,谁在发送信号,谁在接收等等等等等等.

    关于multithreading - 当 child 被杀死时,防止线程 subprocess.popen 终止我的主脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15351732/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com