【问题标题】:Exit a subprocess with ruby使用 ruby​​ 退出子进程
【发布时间】:2021-03-16 12:35:24
【问题描述】:

我正在尝试每 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 这不是一个可行的解决方案。

任何帮助将不胜感激!

【问题讨论】:

    标签: ruby bash popen


    【解决方案1】:

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

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

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

    或者,创建一个运行带有重定向的 top 的包装器 shell 脚本,并将其设置为在它退出时终止 top:How do I terminate all the subshell processes? 然后让 Ruby 运行该包装器脚本。

    【讨论】:

    • 您好,谢谢您的回答。我想可能会发生这样的事情。真是愚蠢的问题,但是如果我要使用cmd = top -s 5 -pid 123stdin, stdout, stderr, wait_thr = Open3.popen3(cmd) 之类的东西,我将如何将输出写入我的文件?并将cmd 的输出保存在内存中吗?
    • 您可以将stdout.getsputs 循环到以a(附加)模式打开的文件。如果您想在脚本继续执行时在后台执行此操作,您可以在 Thread 中执行此操作。如果您对 shell 脚本更熟悉,我建议您按照答案末尾的建议制作包装器 shell 脚本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多