Ruby PTY产生左伪终端设备文件已打开

时间:2018-08-17 22:24:28

标签: ruby pty

我在使用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 个答案:

答案 0 :(得分: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