首页 > 解决方案 > 使用 ruby​​ 退出子进程

问题描述

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

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 这不是一个可行的解决方案。

任何帮助,将不胜感激!

标签: rubybashpopen

解决方案


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

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

我建议改用Popen3并在top -s 5 -pid 123没有重定向的情况下运行。这为您提供了子进程及其标准输出/标准错误,因此您可以自己管理输出(例如将其附加到文件中),同时能够杀死它。

或者,制作一个运行带有重定向的 top 的包装器 shell 脚本,并将其设置为在它退出时终止 top:如何终止所有子 shell 进程?然后让 Ruby 运行该包装脚本。


推荐阅读