如何列出正在运行的屏幕会话?
Posted
技术标签:
【中文标题】如何列出正在运行的屏幕会话?【英文标题】:How to list running screen sessions? 【发布时间】:2010-10-06 23:31:52 【问题描述】:我有一堆服务器,我在这些服务器上使用screen
运行实验。流程如下:
ssh
到服务器 XXX
启动screen
在几个选项卡中开始实验
分离screen
从服务器断开
在运行实验时,我可以通过ssh
向所有服务器发送并列出我正在运行的进程(使用top
或ps
)轻松找到它们在哪些服务器上。
但是,一旦实验完成,我如何才能找到在哪些服务器上打开了屏幕会话(以便我可以查看输出、重新启动它们等)?
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
【讨论】:
以上是关于如何列出正在运行的屏幕会话?的主要内容,如果未能解决你的问题,请参考以下文章