用 ruby​​ 退出子进程

问题描述

我试图每 5 秒将 top输出写入一个文件,我也开始工作了。

cmd = "top -s 5 -pid 123 >> top.txt"
p = IO.popen(cmd)

但是,我遇到的问题是我找不到关闭 top方法 我试过了

Process.kill('KILL',p.pid)

top 不断写入输出文件p.close 挂起但如果我 ctrl + c 它似乎也退出 top 命令。但这需要我手动 ctrl + c 它不是一个可行的解决方案。

任何帮助将不胜感激!

解决方法

问题在于重定向。 >> 是 shell 的一个特性:它启动进程并将其标准输出连接到给定的文件。为了让 Ruby 做到这一点,它实际上启动了一个 shell,它启动 top 并设置重定向。

所以 p.pid 是 shell 的 PID,而不是 top。当你杀死它时,它只会杀死 shell,而 top 被拒绝,继续在 PID 1 下运行。

我建议改用 Popen3 并只运行 top -s 5 -pid 123 而无需重定向。这为您提供了子进程及其 stdout/stderr,因此您可以自己管理输出(例如将其附加到文件中),同时能够杀死它。

或者,制作一个带重定向运行 top 的包装 shell 脚本,并设置它在退出时杀死 top:How do I terminate all the subshell processes? 然后让 Ruby 运行该包装脚本。