gpt4 book ai didi

python - 在不离开僵尸进程的情况下启动进程并从 Ruby on Rails 应用程序中将其终止

转载 作者:数据小太阳 更新时间:2023-10-29 08:08:12 27 4
gpt4 key购买 nike

我正在开发 Ruby on Rails 应用程序。部分功能是通过串行端口启动和关闭与 Modbus 从站的连接,获取数据并将其存储到数据库中。我还用 python 编写了一个脚本,它完全满足我的需要,所以我不想重新发明轮子并将其重写为 Ruby。

我的想法是启动一个将执行 python 脚本的进程,并在不再需要时终止该进程。

我按如下方式启动进程,因此我可以访问它的 pid:

def start
...
@@pids[ object.id ] = IO.popen("python ./python_script_name.py").pid
...

@@pids 是一个散列,它存储所有启动进程的 pids,键为 object.id(假设每个对象只能启动一个进程)

当我想关闭连接时,我会像这样终止进程:

def stop
...
pid = @@pids[ object.id ]
system("kill #{pid}")

这会导致僵尸进程(在 ps aux | grep python 之后可见):

[python] <defunct>

我试图向 Rails 应用程序发送 SIGCHLD 信号(因为它是之前调用的 python 脚本的父级)但它不起作用。

我想补充一点,我可能需要经常调用/终止这个进程,所以它会导致大量的僵尸进程。

如何在不留下僵尸进程的情况下终止进程?

最佳答案

问题不在 python 脚本中 - 默认情况下信号被正确处理(实现 signal 模块后没有变化)。

问题出在 ruby​​ 脚本中。终止进程后,其父进程(在本例中为 Rails 服务器)需要以某种方式知道它已被终止。为此,有一个 wait 函数。来自 ruby 文档:

The parent process should use Process.wait to collect the termination status of its child

因此,要正确处理杀死子进程,需要遵循:

def stop
...
pid = @@pids[ object.id ]
Process.kill( 15, pid )
Process.wait( pid )
...

关于python - 在不离开僵尸进程的情况下启动进程并从 Ruby on Rails 应用程序中将其终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29845778/

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