重新附加到现有的屏幕会话

Joh*_*ino 111 command-line gnu-screen

我有一个程序在屏幕下运行。事实上,当我从会话中分离并检查 netstat 时,我可以看到程序仍在运行(这正是我想要的):

udp        0      0 127.0.0.1:1720          0.0.0.0:*                           3759/ruby       
Run Code Online (Sandbox Code Playgroud)

现在我想重新连接到运行该进程的会话。所以我启动了一个新终端,然后输入 screen -r

$ screen -r
There are several suitable screens on:
    5169.pts-2.teamviggy    (05/31/2013 09:30:28 PM)    (Detached)
    4872.pts-2.teamviggy    (05/31/2013 09:25:30 PM)    (Detached)
    4572.pts-2.teamviggy    (05/31/2013 09:07:17 PM)    (Detached)
    4073.pts-2.teamviggy    (05/31/2013 08:50:54 PM)    (Detached)
    3600.pts-2.teamviggy    (05/31/2013 08:40:14 PM)    (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
Run Code Online (Sandbox Code Playgroud)

但是我怎么知道哪个会话是运行我创建的那个进程的呢?

现在我遇到的其中一份文件说:

“当你使用一个窗口时,输入 Ca A 给它一个名字。这个名字将用于窗口列表中,当你开始使用很多窗口时,它会帮助你记住你在每个窗口中所做的事情。 ”

问题是当我进入一个新的屏幕会话时,我尝试按 control+a A 并且没有任何反应。

Pau*_*aul 115

这里涉及两个级别的“列表”。首先,您在单个会话中有“窗口列表”,这就是 ctrl-A A 的用途;其次,有一个“会话列表”,它是您在问题中粘贴的内容,也可以使用screen -ls.

您可以使用-S参数自定义会话名称,否则它将使用您的主机名 (teamviggy),例如:

$ screen
Run Code Online (Sandbox Code Playgroud)

(ctrl-A d 分离)

$ screen -S myprogramrunningunderscreen
Run Code Online (Sandbox Code Playgroud)

(ctrl-A d 分离)

$ screen -ls

There are screens on:
    4964.myprogramrunningunderscreen    (05/31/2013 09:42:29 PM)    (Detached)
    4874.pts-1.creeper  (05/31/2013 09:39:12 PM)    (Detached)
2 Sockets in /var/run/screen/S-paul.
Run Code Online (Sandbox Code Playgroud)

作为奖励,您可以使用-S稍后传递给的名称的明确缩写来重新连接:

screen -r myprog
Run Code Online (Sandbox Code Playgroud)

(我重新连接到myprogramrunningunderscreen会话)


小智 66

我有一个screen -r无法重新连接的情况。添加-d标志,使其看起来像这样

screen -d -r
Run Code Online (Sandbox Code Playgroud)

为我工作。它分离了之前的屏幕并允许我重新连接。有关更多信息,请参阅手册页。

  • IMO,您应该注意“-d”开关的作用...仅供参考,“-d”分离“附加”会话(即附加在其他地方的现有会话),而“-r”在本地重新附加。 (4认同)
  • 为了稍微扩展一下这个答案 - 当您执行“screen -list”并在“(附加)”模式下查看它时,这是正确的命令。如果您的连接不稳定,就会发生这种情况。我选择屏幕的主要原因之一。 (2认同)

小智 18

一个简单的方法是简单地重新连接到任意屏幕

screen -r
Run Code Online (Sandbox Code Playgroud)

然后,一旦您运行 screen,您就可以通过点击Ctrl-A "(即 control-A 后跟双引号)来获取所有活动屏幕的列表。然后,您可以一次选择一个活动屏幕并查看它们正在运行的内容。当然,为屏幕命名会更容易识别正确的屏幕。

只是我的两分钱


Lef*_*ogh 6

当我需要在多个集群中的多台机器上工作时,我倾向于使用以下组合:

screen -S clusterX
Run Code Online (Sandbox Code Playgroud)

这将创建新的屏幕会话,我可以在其中构建环境。

screen -dRR clusterX
Run Code Online (Sandbox Code Playgroud)

这是我随后用来重新附加到该屏幕会话的内容。漂亮的一点是,如果会话附加到其他地方,它会分离其他显示。此外,如果由于某种奇怪的原因没有会话,比如有人在我不知道的情况下重新启动了我的服务器,它会创建一个。最后。如果存在多个会话,则使用第一个会话。

不久前,此技巧对https://support.dvsus.com/hc/en-us/articles/212925186-Linux-GNU-Screen-instructions表示赞赏。

编辑:

这里还有一些man screen关于神秘参数的有用解释

       -d -r   Reattach a session and if necessary detach it first.

       -d -R   Reattach a session and if necessary detach or  even  create  it
               first.

       -d -RR  Reattach  a  session  and if necessary detach or create it. Use
               the first session if more than one session is available.

       -D -r   Reattach a session. If necessary  detach  and  logout  remotely
               first.
Run Code Online (Sandbox Code Playgroud)

还有更多,-D所以一定要检查man screen