【问题标题】:Ruby PTY spawn left pseudoterminal device file openedRuby PTY 生成左伪终端设备文件已打开
【发布时间】:2018-08-17 22:24:28
【问题描述】:

我在使用 Ruby PTY gem 时遇到了问题。似乎在我使用 PTY 生成一个进程后,它会留下打开的设备文件 /dev/ptmx

例子:

require 'pty'
PTY.spawn('ls') do |r,w,pid|
  Process.kill(9, pid)
  Process.wait(pid)
end

对于上面的每个生成,我都剩下:

ruby      72578  user  10u      CHR               15,8       0t0      572 /dev/ptmx
ruby      72578  user  11u      CHR               15,8       0t0      572 /dev/ptmx

程序完成后文件最终会关闭,但我的服务器并非旨在终止。

我认为使用“PTY.spawn ... do”块将确保 PTY 清理所有内容。但是我错了。是否有适当的方法来终止 PTY?

【问题讨论】:

  • 请注意,如果您 1) 不终止底层进程,或 2) 手动 close 块中的读写句柄,则不会发生此问题。

标签: ruby pty


【解决方案1】:

这似乎是spawn 的错误(或功能?)。如果您过早地终止底层进程,它似乎只会发生。

但是,通过自己关闭文件句柄很容易解决此问题。这可以像这样透明地完成:

def PTY.spawn_safe(command, &block)
  PTY.spawn(command) do |r,w,pid|
    yield r,w,pid
    w.close
    r.close
  end
end

# No more dangling file handles
PTY.spawn_safe('ls') do |r,w,pid|
  Process.kill(9, pid)
  Process.wait(pid)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2014-10-23
    • 2023-03-11
    相关资源
    最近更新 更多