gpt4 book ai didi

linux - 执行程序崩溃后如何重置 tty?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:09:11 25 4
gpt4 key购买 nike

我正在围绕 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) 系统调用,因此没有 fork 。一个问题是容器有时会过早死亡,这会有效地杀死我新创建的 Bash 提示符。然后,我返回了最初用于运行我的 Ruby 工具的提示,但我再也看不到我在输入什么,tty 似乎损坏了,运行重置有效地解决了这个问题。

如果我执行的程序崩溃,我想有条件地运行 reset。我发现以下效果很好:

$ ./myrubytool || reset

除非我想避免强制人们使用我的工具附加 ||每次重置

我尝试了以下方法:

payload = "(sudo nsenter --target #{pid(container_name)} --mount --uts --ipc --net --pid -- env #{env} /bin/bash -i -l) || reset;"

但这令人惊讶地将 reset 置于后台(即我可以通过输入 fg 来运行 reset)。一个好处是 tty 可以正常工作,但并不是很理想。

您有解决这个问题的想法吗?

最佳答案

如果终端回显已在终端中禁用,则您可以运行命令stty echo 以重新启用终端回显。(相反,stty -echo 禁用终端回显,stty -a 显示所有终端设置。)

即使终端回显已经启用,运行也是安全的,所以如果你想安全地运行它,你可以做类似 ./myrubytool 的事情; stty echo 如果终端回显被禁用,无论您的 Ruby 程序的退出状态如何,它都会重新启用终端回显。如果需要,您可以将其放入 shell 脚本中。

可能有一种方法可以在 Ruby 程序退出时执行命令(通常称为“陷阱”),但我对 Ruby 不够熟悉,不知道是否存在这种能力。

但是,如果您要创建通用脚本,您可能应该研究更可靠的技术,而不是依赖变通方法。

关于linux - 执行程序崩溃后如何重置 tty?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24247225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com