如何列出正在运行的屏幕会话?

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何列出正在运行的屏幕会话?的主要内容,如果未能解决你的问题,请参考以下文章

如何附加到现有的屏幕会话或创建新的屏幕会话并运行命令?

如何强制从另一个 SSH 会话中分离屏幕?

如何在不重新加入会话的情况下检查屏幕会话的进度?

您如何从屏幕会话中编写 gnu screen 脚本以打开新窗口并在其中运行命令?

多点连接:列出所有附近的会话

如何列出所有活动会话的所有准备好的语句?