我正在尝试编写一个python程序来测试用C编写的服务器。python程序使用以下subprocess
模块启动已编译的服务器:
pid = subprocess.Popen(args.server_file_path).pid
这可以正常工作,但是如果python程序由于错误而意外终止,则生成的进程将保持运行状态。我需要一种方法来确保如果python程序意外退出,服务器进程也会被杀死。
更多细节:
我需要atexit.register
一个函数来终止该过程:
import atexit
process = subprocess.Popen(args.server_file_path)
atexit.register(process.terminate)
pid = process.pid
或许:
import atexit
process = subprocess.Popen(args.server_file_path)
@atexit.register
def kill_process():
try:
process.terminate()
except OSError:
pass #ignore the error. The OSError doesn't seem to be documented(?)
#as such, it *might* be better to process.poll() and check for
#`None` (meaning the process is still running), but that
#introduces a race condition. I'm not sure which is better,
#hopefully someone that knows more about this than I do can
#comment.
pid = process.pid
请注意,如果您进行了一些令人讨厌的操作,导致python以非优雅的方式死亡(例如,通过os._exit
或如果导致SegmentationFault
或BusError
),则这对您没有帮助
问题内容: 我从python脚本生成了5个不同的进程,如下所示: 我的问题是,当父进程(主脚本)以某种方式被杀死时,子进程继续运行。 当父进程被杀死时,有没有办法杀死这样生成的子进程? 编辑:我正在尝试: 但这似乎不起作用 问题答案: 我自己也遇到了同样的问题,我有以下解决方案: 打电话之前,您可以设置。然后如此处所述python.org multiprocessing 进程退出时,它将尝试终止其
问题内容: 子进程开始于 有没有办法确保在父异常终止时将其杀死?我需要在Windows和Linux上都能使用。 编辑: 如果存在使用其他启动进程的方法的解决方案,则可以放宽启动子进程的要求。 问题答案: 呵呵,我昨天自己在研究这个!假设您无法更改子程序: 在Linux上,可能是唯一可靠的选择。(如果绝对有必要终止子进程,那么您可能希望将终止信号设置为SIGKILL而不是SIGTERM;链接到的代码
问题内容: 我有一个程序生成并与CPU繁重,不稳定的进程通信,而不是由我创建的。如果我的应用程序崩溃或被杀死,我也希望子进程也被杀死,因此用户不必跟踪它们并手动杀死它们。 我知道以前已经讨论过该主题,但是我已经尝试了所有描述的方法,但似乎没有一种方法能够经受住测试的考验。 我知道这是有可能的,因为终端一直在这样做。如果我在终端中运行某些程序并杀死该终端,则这些东西总是会死掉。 我试过了,双叉和。不
问题内容: 我正在使用child_process.spawn()从在Ubuntu上运行的Node.JS应用程序启动脚本。据我所知,标准的分叉或生成的* nix进程通常不会在父进程死后死亡,但是当从Node.JS生成进程时,它们似乎在我的应用程序崩溃或被ctrl-c等终止时被杀死。 。 为什么会这样,并且有解决办法?我似乎在child_process API中找不到任何明显的选项。 我的应用程序启动
问题内容: 我在Linux机器上运行python脚本,该脚本使用subprocess.check_output()创建一个子进程,如下所示: 问题是,即使父进程死亡,子进程仍在运行。父母去世后,我还有什么办法可以杀死子进程? 问题答案: 您的问题是使用-是正确的,您无法使用该接口获取子PID。改用Popen: 为了确保您在出口处杀死孩子:
问题内容: 我正在python中使用subprocess模块运行一些shell脚本。如果shell脚本运行时间很长,我想杀死该子进程。我认为如果将其传递给我的陈述就足够了。 这是代码: 我已经用一些运行120秒的shell脚本测试了此调用。我期望子进程在30秒后被杀死,但是实际上该进程正在完成120秒脚本,然后引发了Timeout Exception。现在的问题是如何通过超时杀死子进程? 问题