ruby - 使用 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 这不是一个可行的解决方案。
任何帮助,将不胜感激!
解决方案
问题是重定向。>>
是 shell 的一个特性:它启动进程并将其标准输出连接到给定文件。为了让 Ruby 执行此操作,它实际上启动了一个 shell,该 shell 启动 top 并设置重定向。
shell的PID也是如此p.pid
,而不是顶部。当你杀死它时,它只会杀死 shell,top 会被拒绝,继续在 PID 1 下运行。
我建议改用Popen3并在top -s 5 -pid 123
没有重定向的情况下运行。这为您提供了子进程及其标准输出/标准错误,因此您可以自己管理输出(例如将其附加到文件中),同时能够杀死它。
或者,制作一个运行带有重定向的 top 的包装器 shell 脚本,并将其设置为在它退出时终止 top:如何终止所有子 shell 进程?然后让 Ruby 运行该包装脚本。
推荐阅读
- java - Java 对某些对象使用相同的引用,但有时它会创建 2 个实例
- mysql - Mysql STR_TO_DATE 在不同的环境中给出不一致的结果
- javascript - 如何在javascript中更新树结构全局json对象的特定节点?
- elasticsearch - 如何降低应用于库存的计数过滤器的复杂性
- python - 从 Kivy 中动态填充的下拉列表中选择性地删除子小部件
- git - 基于存储库路径全局配置 git 用户邮箱
- azure - 验证失败时 Azure 数据工厂处理结束
- python - 如何使用条件获取 sqlalchemy 中的行数列表?
- python - Jupyter notebook 给了我正确代码的错误
- google-cloud-platform - 使用大查询数据传输作业的最大文件数