【问题标题】:How to list running screen sessions?如何列出正在运行的屏幕会话?
【发布时间】:2010-10-06 23:31:52
【问题描述】:

我有一堆服务器,我在这些服务器上使用screen 运行实验。流程如下:

  1. ssh 到服务器 XXX
  2. 启动screen
  3. 在几个选项卡中开始实验
  4. 分离screen
  5. 从服务器断开

在运行实验时,我可以通过ssh向所有服务器发送并列出我正在运行的进程(使用topps)轻松找到它们在哪些服务器上。

但是,一旦实验完成,我如何才能找到在哪些服务器上打开了屏幕会话(以便我可以查看输出、重新启动它们等)?

PS:我的实验也会将它们的输出打印到文件中……但这不是我的问题的重点。

【问题讨论】:

    标签: linux bash command-line gnu-screen


    【解决方案1】:

    简单的记忆指南...

    screen - 创建一个屏幕

    screen -list - 列出所有分离(运行)的屏幕及其屏幕 ID。

    在这张照片中 -

    6764.pts-1.v1091330

    是屏幕 ID。

    screen -x [screen id] - 连接/附加到特定的运行屏幕。

    Ctrl + D - 在屏幕中终止/停止屏幕运行。

    Ctrl + A, Then press D - 在屏幕中时从屏幕上分离而不打扰它。

    killall screen - 分离或终止所有屏幕。

    【讨论】:

      【解决方案2】:

      您可以使用以下命令。

      screen -list
      

      (或)

      screen -R
      

      【讨论】:

        【解决方案3】:

        ps x | grep 屏幕

        如果您使用该命令,则查看该屏幕正在运行的内容

        screen -A -m -d php make_something.php

        【讨论】:

          【解决方案4】:

          很多人已经指出

          $ screen -ls
          

          将列出屏幕会话。

          这是另一个可能对您有用的技巧。

          如果您在 .bashrc 中添加以下命令作为最后一行 服务器 xxx 上的文件,然后它将自动重新连接到您的 登录时的屏幕会话。

          screen -d -r
          

          希望你觉得它有用。

          【讨论】:

          • 我想指出,您必须以启动屏幕的同一用户身份登录,我担心我的屏幕会话已经消失,但我的文件复制在用户“媒体”下继续”。这听起来可能合乎逻辑,但如果你监督它,它可以避免一些恐慌。
          【解决方案5】:

          要列出用户的所有屏幕会话,请以该用户身份运行以下命令:

          screen -ls
          

          要查看特定机器上的所有屏幕会话,您可以执行以下操作:

          ls -laR /var/run/screen/
          

          我在我的机器上得到了这个:

          gentle ~ # ls -laR /var/run/screen/
          
          /var/run/screen/:
          total 1
          drwxrwxr-x  4 root utmp   96 Mar  1  2005 .
          drwxr-xr-x 10 root root  840 Feb  1 03:10 ..
          drwx------  2 josh users  88 Jan 13 11:33 S-josh
          drwx------  2 root root   48 Feb 11 10:50 S-root
          
          /var/run/screen/S-josh:
          total 0
          drwx------ 2 josh users 88 Jan 13 11:33 .
          drwxrwxr-x 4 root utmp  96 Mar  1  2005 ..
          prwx------ 1 josh users  0 Feb 11 10:41 12931.pts-0.gentle
          
          /var/run/screen/S-root:
          total 0
          drwx------ 2 root root 48 Feb 11 10:50 .
          drwxrwxr-x 4 root utmp 96 Mar  1  2005 ..
          

          这是一个相当出色的 Unixy 使用 Unix 套接字包装在文件系统权限中来处理安全、状态和流。

          【讨论】:

          • 我想知道为什么这个答案,一个完美回答了这个问题的答案,却遭到了反对...
          • 或者,如果您想根据命名约定获得特定屏幕,您可以 grep 结果。 ls -R /var/run/screen/S-root/ | grep "NamingConvention"。屏幕以<pid>.<screen_name> 格式保存。这对于 bash 脚本很有用。因此,如果您有一个名称为 0000.NamingConvention 的屏幕,它实际上只会以易于解析的格式返回您正在寻找的屏幕的名称。
          【解决方案6】:
           For windows system
          
           Open putty 
           then login in server
          

          如果你想在控制台中看到屏幕,那么你必须编写命令

           Screen -ls
          

          如果你必须访问屏幕,那么你必须使用下面的命令

           screen -x screen id
          

          在命令行中写PWD查看你当前所在的文件夹

          【讨论】:

            【解决方案7】:

            在大多数情况下,screen -RRx $username/ 就足够了 :)

            如果您仍想列出所有屏幕,请输入以下内容 在您的路径中编写脚本并将其称为屏幕或任何您喜欢的名称:

            #!/bin/bash
            if [[ "$1" != "-ls-all" ]]; then
                exec /usr/bin/screen "$@"
            else
                shopt -s nullglob
                screens=(/var/run/screen/S-*/*)
                if (( ${#screens[@]} == 0 )); then
                    echo "no screen session found in /var/run/screen"
                else
                    echo "${screens[@]#*S-}"
                fi
            fi
            

            除了显示所有屏幕会话外,它的行为与屏幕完全相同, 将选项 -ls-all 作为第一个参数时。

            【讨论】:

              【解决方案8】:

              虽然 joshperry 的回答是正确的,但我觉得很烦人的是它没有告诉您屏幕名称(您使用 -t 选项设置的名称),这实际上是您用来识别会话的名称。 (当然不是他的错,那是屏幕的缺陷)

              这就是我改用如下脚本的原因:ps auxw|grep -i screen|grep -v grep

              【讨论】:

              • 看看 -S 选项。提供的值存储在 unix 套接字文件名中,并且在 ls 输出中可见。如果需要,也可以保留 -t 选项。
              • -S 选项很棒,因为它还允许您使用该会话名称恢复:screen -rd <sessionname>
              【解决方案9】:

              所以您使用屏幕来保持实验在后台运行,还是什么?如果是这样,为什么不直接在后台启动呢?

              ./experiment &
              

              如果您要问如何通知我完成的工作,那么将实验与邮件命令串在一起怎么样?

              ./experiment && echo "the deed is done" | mail youruser@yourlocalworkstation -s "job on server $HOSTNAME is done"
              

              【讨论】:

              • 我正在使用屏幕,以便在不终止实验的情况下断开与服务器的连接。问题不在于如何获取通知(尽管邮件可能是一种很好的方式),而是如何查找给定机器是否有打开的屏幕会话。无论如何感谢您的回答!
              • 我不是经验丰富的系统管理员,但我发现使用 screen 运行服务器进程效果很好:如果出现问题,您只需轻弹到该窗口,然后查看导致问题 - 您不需要开始打开日志文件。这也意味着您可以使用 ctrl+c 轻松终止进程。如果您经常启动和关闭同一个服务,这一切都很方便。
              【解决方案10】:

              我不太确定您的问题,但如果您真正想要的是列出当前打开的屏幕会话,请尝试:

              screen -ls
              

              【讨论】:

                【解决方案11】:

                screen -list命令可能是你想要的。

                man

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-02-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-25
                  • 2013-08-26
                  • 2013-08-23
                  相关资源
                  最近更新 更多