使用 ruby 退出子进程
Exit a subprocess with 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,它从顶部开始并设置重定向。
所以p.pid
是shell的PID,不是top。当你杀死它时,它只会杀死 shell 并且 top 会被断绝关系,继续到 PID 1 下的 运行。
我建议改用 Popen3 并且 运行 仅 top -s 5 -pid 123
而不使用重定向。这为您提供了子进程及其 stdout/stderr,因此您可以自己管理输出(例如将其附加到文件),同时能够终止它。
或者,制作一个包装器 shell 脚本,运行 通过重定向将其置于顶部,并将其设置为在它退出时终止顶部:How do I terminate all the subshell processes? 然后 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,它从顶部开始并设置重定向。
所以p.pid
是shell的PID,不是top。当你杀死它时,它只会杀死 shell 并且 top 会被断绝关系,继续到 PID 1 下的 运行。
我建议改用 Popen3 并且 运行 仅 top -s 5 -pid 123
而不使用重定向。这为您提供了子进程及其 stdout/stderr,因此您可以自己管理输出(例如将其附加到文件),同时能够终止它。
或者,制作一个包装器 shell 脚本,运行 通过重定向将其置于顶部,并将其设置为在它退出时终止顶部:How do I terminate all the subshell processes? 然后 Ruby 运行 包装脚本。