【发布时间】:2014-06-11 19:01:44
【问题描述】:
我正在围绕 Docker 和 nsenter 编写一个 Ruby 包装器。我的工具提供的命令之一是在容器中启动 Bash shell。目前,我正在这样做:
payload = "sudo nsenter --target #{pid(container_name)} --mount --uts --ipc --net --pid -- env #{env} /bin/bash -i -l;"
Kernel.exec(payload)
在 Ruby 中,Kernel#exec 依赖于 exec(2) 系统调用,因此没有分叉。
一个问题是容器有时会过早死亡,这有效地杀死了我新创建的 Bash 提示符。然后我恢复了最初用于运行我的 Ruby 工具的提示,但我看不到我正在输入的内容,tty 似乎坏了,运行 reset 有效地解决了这个问题。
如果我执行的程序崩溃,我想有条件地运行reset。我发现以下方法效果很好:
$ ./myrubytool || reset
除了我想避免强迫人们使用我的工具每次都附加|| reset。
我尝试了以下方法:
payload = "(sudo nsenter --target #{pid(container_name)} --mount --uts --ipc --net --pid -- env #{env} /bin/bash -i -l) || 重置;"
但这令人惊讶地将reset 置于后台(即我可以通过输入fg 运行重置)。一个好处是 tty 工作正常,但并不理想。
你有什么办法解决这个问题吗?
【问题讨论】: