(这是一个关于 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
正如您所看到的,我已经尝试添加和注释各种选项来尝试解决此问题。 (刚才,我已经尝试使用 和fish
,bash
从两个fish
和bash
外部会话,有和没有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
如果出现“真实”答案(即如果我发现我的屏幕安装出了什么问题),我将用新答案更新此问题。