如何调试/修复启动时的屏幕崩溃

如何调试/修复启动时的屏幕崩溃

(这是一个关于 Gnu screen 的 OS X 版本的问题。我不知道这是否有什么区别 - 我猜 Unix 和 Linux 会有比 Ask Different 更好的 screen-fu。)

当我在终端上的计算机上输入如下命令时

screen -dRR my_session_name

访问新的屏幕会话。

在 SSH 上,如果会话已经在运行,我似乎可以重新附加它们:

screen -R my_session_name

但创建一个新会话(无论是否存在其他会话,但最令人沮丧的是,当没有其他会话存在时)悬挂,逃避的唯一方法是^Z将其推到后台,然后重新fg启动作业,此时我被告知它已经死了(Sorry, cannot contact session "processnumber.tty.hostname" again.

我尝试过运行sudo dtruss screen(Mac OS X 版本的strace),但我不知道在(极其详细的)输出中寻找什么。

我离开我的机器一段时间了(在另一个城市待了几天),我真的需要开始一个新的屏幕会话!

我的~/.screenrc

# Set the shell to use fish:
shell "/usr/local/bin/fish"

# Make xterm scrolling work properly with screen.
# Note, this works in Terminal.app and iTerm too.
#termcapinfo xterm-256color|xterm-color|xterm|xterms|xs|rxvt ti@:te@

# Custom escape character like this:
escape ^Xx

# always create these sessions for me:
screen -t "foo" 1

# test to see if I can create new screens from SSH in any way:
#nonblock on

正如您所看到的,我已经尝试添加和注释各种选项来尝试解决此问题。 (刚才,我已经尝试使用 和fishbash从两个fishbash外部会话,有和没有noblock,以及有和没有screen -t。)我还在非常快和非常慢的连接上看到了相同的行为。

如果您提供以下任何信息,我将不胜感激:

  • 关于查找问题的建议(strace/dtrace 输出的重要部分,还有其他内容吗?)
  • .screenrc选项的建议,
  • 完全不同的东西?

我很高兴发布更多信息,但希望避免整个dtruss输出,因为它有数百行长。

答案1

横向回答,在这种情况下是 OS X 特定的。

一种选择,也是我在本例中最终使用的一种选择,如下:

使用某些东西在本地启动screen,这将起作用,然后重新附加到会话。

我编写了一个 python 程序,它生成并运行一个 Apple 脚本程序,该程序会打开一个新的 Terminal.app 窗口并运行您要求的命令,即使您通过 SSH 也是如此(显然,该帐户必须在 GUI 上登录)机器本身才能工作)。

它被称为“osxhijack”,位于 github 上这里。你像这样调用它:

hijack screen -dRR my_new_session

然后您可以使用以下命令立即重新连接:

screen -R my_new_session

如果出现“真实”答案(即如果我发现我的屏幕安装出了什么问题),我将用新答案更新此问题。

相关内容