问题描述
我试图每 5 秒将 top
的输出写入一个文件,我也开始工作了。
cmd = "top -s 5 -pid 123 >> top.txt"
p = IO.popen(cmd)
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 运行该包装脚本。