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


233

我有一堆服务器,可以使用在服务器上运行实验screen。步骤如下:

  1. ssh 到服务器XXX
  2. 发射 screen
  3. 在几个标签中开始实验
  4. 分离 screen
  5. 与服务器断开连接

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

但是,一旦实验完成,如何查找打开了屏幕会话的服务器(以便可以查看输出,重新启动它们,等等)?

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

Answers:


420

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

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套接字的一种非常出色的使用,它包装在文件系统权限中以处理安全性,状态和流。


1
我不知道为什么这个答案,完美回答了这个问题的人,
投票否决

或者,如果您希望基于命名约定获得特定屏幕,则可以grep结果。ls -R /var/run/screen/S-root/ | grep "NamingConvention"。屏幕以<pid>.<screen_name>格式保存。这对于bash脚本很有用。因此,如果您有一个带有名称的屏幕,0000.NamingConvention它将以一种易于解析的格式按字面意思返回您要查找的屏幕的名称。
伊莱亚斯·兰兹


13

尽管joshperry的答案是正确的,但我感到非常烦人的是,它没有告诉您屏幕名称(使用-t选项设置的屏幕名称),实际上是您用来标识会话的名称。(当然,这不是他的错,这是屏幕的缺陷)

这就是为什么我改用这样的脚本的原因: ps auxw|grep -i screen|grep -v grep


2
看一下-S选项。提供的值存储在UNIX套接字文件名中,并且在ls输出中可见。如果需要,还可以保留-t选项。
joshperry17年

-S选项很棒,因为它还允许您使用该会话名称来恢复:screen -rd <sessionname>
jorisw

7

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

screen -ls

6
 For windows system

 Open putty 
 then login in server

如果要在控制台中查看屏幕,则必须编写命令

 Screen -ls

如果必须访问屏幕,则必须使用以下命令

 screen -x screen id

PWD在命令行中编写以检查当前位于哪个文件夹


3

在大多数情况下,一个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作为第一个参数时,除了显示所有屏幕会话外,它的行为与屏幕完全相同。


3

许多人已经指出

$ screen -ls

将列出屏幕会话。

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

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

screen -d -r

希望你觉得它有用。


1
我想指出的是,您必须以启动屏幕的同一用户身份登录,我担心屏幕会话已消失,但是文件副本仍在“媒体”用户下继续。这听起来似乎合乎逻辑,但如果您对此加以监督,则可以节省一些恐慌。
保罗

0

ps x | grep屏幕

看看在使用命令的情况下该屏幕正在运行什么

屏幕-A -m -d php make_something.php


-4

因此,您正在使用屏幕使实验在后台运行,还是什么?如果是这样,为什么不在后台启动它呢?

./experiment &

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

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

我正在使用屏幕,以便可以在不终止实验的情况下与服务器断开连接。问题不在于如何获取通知(尽管邮件可能是一种很好的方式),而是如何查找给定机器是否具有打开的屏幕会话。无论如何,谢谢您的回答!
Wookai

我不是一个经验丰富的系统管理员,但是我发现使用屏幕来运行服务器进程非常有效:如果出现问题,您可以轻拂至该窗口,并查看所有导致问题的输出-不需要开始打开日志文件。这也意味着您可以使用ctrl + c轻松终止进程。如果您经常启动和关闭同一服务,那么这一切都非常方便。
史蒂夫·本内特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.