【问题标题】:Shell script in Python subprocess.Popen does not terminate childPython subprocess.Popen 中的 Shell 脚本不会终止子进程
【发布时间】:2018-02-27 10:52:04
【问题描述】:

我在中断subprocess.Popen 时遇到问题这是设置:

我有一个 Tkinter gui,它正在使用 Popen 运行另一个 python 脚本。这个内部脚本(我们称之为running script)正在运行一个shell shell 脚本,该脚本使用Popen 执行一段C++ 代码,因此层次结构如下所示:

GUI
\running_script
 \shell-script
  \c++

running_script 的工作原理是,如果它接收到中断,它会将 SIGINT 发送到shell-script。如果我用我的一段 C++ 代码和 running_script 单独运行 shell_script 并执行 CRTL+C 一切都会像魅力一样。但是,如果我使用将running_script 作为 Popen 运行的 GUI 来执行此操作,则将 SIGINT 发送到running_script 正确接收它并将中断信号发送到shell-script,而不是终止内部进程(作为 c++ 代码), shell-script 自行终止,C++ 进程继续运行,因为它是在后台运行的,但事实并非如此。当我执行ps -xaf 时,树看起来像这样:

GUI
\running_script
 \shell-script <defunct>
c++

所以重申一下,当我在没有 GUI 的情况下运行它时,它就像一个魅力,但使用 GUI 时,它的行为如上所述。我也尝试发送shell-command SIGTERM 而不是 SIGINT,结果是一样的。

【问题讨论】:

    标签: python python-2.7 tkinter popen


    【解决方案1】:

    您可以在 shell 脚本中捕获 SIGINT 并将其发送到 c++ 程序,例如:

    #!/bin/bash
    ./cpp_program &
    procpid=$!
    function killit() {
        kill -SIGINT $procpid
    }
    trap killit SIGINT
    ......
    

    【讨论】:

    • 嘿@hir12111 感谢您的回复。不幸的是,这不是我可以使用的解决方案,但我已经记住了。原因是有超过 1000 个 shell 脚本,而且它们每天都被一个大团队添加,团队不愿意仅仅为了一个辅助 python 应用程序而改变他们的流程。相反,我想知道为什么 SIGINT 在没有 GUI 的情况下传播,而不是在 GUI 处于活动状态时传播。
    猜你喜欢
    • 2021-11-08
    • 2019-08-01
    • 2014-10-25
    • 2016-09-29
    • 2010-11-01
    • 2014-09-27
    • 2020-10-14
    • 2011-12-10
    • 2022-01-19
    相关资源
    最近更新 更多