文章目录
- screen是什么
-
- [电脑a的xshell连接了一个ssh终端,不管是关掉 xshell正在连接的ssh终端,还是直接关掉电脑a,还是电脑a出现任何的问题,screen都会在服务器上运行吗](#电脑a的xshell连接了一个ssh终端,不管是关掉 xshell正在连接的ssh终端,还是直接关掉电脑a,还是电脑a出现任何的问题,screen都会在服务器上运行吗)
- 平常在xshell里运行脚本,只要吧xshell链接的终端关了,或者xshell关了,或者电脑a关了,脚本自动就结束了是吧
-
- [Xshell 里的那个 ssh 窗口 = 给服务器开的一个"远程黑框框"(终端)](#Xshell 里的那个 ssh 窗口 = 给服务器开的一个“远程黑框框”(终端))
- [那什么时候关掉 Xshell 还能继续跑?](#那什么时候关掉 Xshell 还能继续跑?)
- screen功能
- 安装screen
- 参数说明
-
- [-A 将所有的视窗都调整为目前终端机的大小。](#-A 将所有的视窗都调整为目前终端机的大小。)
- [-d 将指定的screen作业离线。](#-d 将指定的screen作业离线。)
- [-h <行数> 指定视窗的缓冲区行数。](#-h <行数> 指定视窗的缓冲区行数。)
- [-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。](#-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。)
- [-r <作业名称> 恢复离线的screen作业。](#-r <作业名称> 恢复离线的screen作业。)
- [-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。](#-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。)
- [-s 指定建立新视窗时,所要执行的shell。](#-s 指定建立新视窗时,所要执行的shell。)
- [-S <作业名称> 指定screen作业的名称。](#-S <作业名称> 指定screen作业的名称。)
- [-v 显示版本信息。](#-v 显示版本信息。)
- [-x 恢复之前离线的screen作业。和-r类似,但支持多个终端同时"附着"在同一个screen会话上](#-x 恢复之前离线的screen作业。和-r类似,但支持多个终端同时“附着”在同一个screen会话上)
- [-ls或--list 显示目前所有的screen作业。](#-ls或--list 显示目前所有的screen作业。)
- [-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。](#-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。)
- [列出所有screen会话 screen -ls](#列出所有screen会话 screen -ls)
-
- [Detached = 后台挂着,人没在看,Attached = 正有人在看(占着)](#Detached = 后台挂着,人没在看,Attached = 正有人在看(占着))
-
- [screen -d -r xxx -d, -r都作用在xxx上](#screen -d -r xxx -d, -r都作用在xxx上)
- [There is a screen on:1502688.myjob (Attached)There is no screen to be resumed.](#There is a screen on:1502688.myjob (Attached)There is no screen to be resumed.)
- [如果你就是那个正在 Attached 的终端本人,在里面再敲 screen -r myjob,那通常会直接黑屏一下,然后"什么都没发生",因为你已经在那个会话里了。](#如果你就是那个正在 Attached 的终端本人,在里面再敲 screen -r myjob,那通常会直接黑屏一下,然后“什么都没发生”,因为你已经在那个会话里了。)
- [screen -r 显示attached的screen,或者提示 There is a screen on:xx都表示这个会话正被某个终端占着](#screen -r 显示attached的screen,或者提示 There is a screen on:xx都表示这个会话正被某个终端占着)
- 新建screen
-
- screen
-
- [直接screen 会新建一个screen会话,名字时xxx.pts-x.xxxx,分别是screen进程的id,所在终端的名字,主机名](#直接screen 会新建一个screen会话,名字时xxx.pts-x.xxxx,分别是screen进程的id,所在终端的名字,主机名)
- [screen -S name](#screen -S name)
- [screen -r 重新连接到 screen 会话](#screen -r 重新连接到 screen 会话)
-
- [screen -r](#screen -r)
- [screen -r 跟「会话名」(你用 -S 起的名字)](#screen -r 跟「会话名」(你用 -S 起的名字))
- [中止 screen 会话](#中止 screen 会话)
-
- [在 screen 里面 结束会话的几种方法](#在 screen 里面 结束会话的几种方法)
-
- 只杀当前窗口
-
- [Ctrl + d/exit](#Ctrl + d/exit)
- [Ctrl + a 然后 k](#Ctrl + a 然后 k)
- [一次性干掉整个 screen 会话:Ctrl + a 然后 \](#一次性干掉整个 screen 会话:Ctrl + a 然后 )
- [在 screen 外面 结束会话的方法](#在 screen 外面 结束会话的方法)
-
- [screen -S xxx -X quit](#screen -S xxx -X quit)
- 顺带再帮你强调一下"退出"和"离开"的区别
- [在每个screen session 下,命令都以 ctrl+a开始](#在每个screen session 下,命令都以 ctrl+a开始)
-
- [ctrl+a d 暂时离开当前session](#ctrl+a d 暂时离开当前session)
- [ctrl+a z](#ctrl+a z)
- 窗口操作
-
- [Ctrl+a+w: 展示当前会话中的所有窗口;](#Ctrl+a+w: 展示当前会话中的所有窗口;)
- [Ctrl+a+c: 创建一个新的窗口,相当于在同一个 screen 里开一个新的终端](#Ctrl+a+c: 创建一个新的窗口,相当于在同一个 screen 里开一个新的终端)
- [Ctrl+a+n: 切换至下一个窗口;](#Ctrl+a+n: 切换至下一个窗口;)
- [Ctrl+a+p: 切换至上一个窗口;](#Ctrl+a+p: 切换至上一个窗口;)
- [Ctrl+a+num: 切换至编号为num的窗口;](#Ctrl+a+num: 切换至编号为num的窗口;)
- [ctrl+a ctrl+a](#ctrl+a ctrl+a)
- [Ctrl+a+k: 杀死当前窗口;](#Ctrl+a+k: 杀死当前窗口;)
- [复制 / 粘贴(copy mode](#复制 / 粘贴(copy mode)
screen是什么
screen = 在服务器上开的"虚拟终端房间"
你可以在这个房间里跑程序,你人走了(ssh 断了 / Xshell 关了 / 电脑关机),房间还在,程序继续跑
和 直接在 Xshell 终端里跑脚本 的区别:
直接跑:终端一关,脚本基本就跟着死
用 screen 跑:终端关了没事,只要 服务器不重启,脚本继续跑
电脑a的xshell连接了一个ssh终端,不管是关掉 xshell正在连接的ssh终端,还是直接关掉电脑a,还是电脑a出现任何的问题,screen都会在服务器上运行吗
只要:服务器那台机器还活着(没重启/没关机),screen 里的东西就会继续跑。
跟你本地电脑 A、Xshell 是否开着,关系不大




平常在xshell里运行脚本,只要吧xshell链接的终端关了,或者xshell关了,或者电脑a关了,脚本自动就结束了是吧
Xshell 里的那个 ssh 窗口 = 给服务器开的一个"远程黑框框"(终端)

那什么时候关掉 Xshell 还能继续跑?

screen功能
screen的功能大体有三个:
-
会话恢复:只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用------即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen
-r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
-
多窗口:在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。
-
会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
一开始看不懂没关系,往下看,都看完回来再看就明白了。
安装screen
shell
# 查看时centos还是Ubuntu
cat /etc/os-release
注意:uname -a 看的是"内核",不是发行版
你可能也见过有人让你敲:
uname -a
这个命令看的是 Linux 内核版本,比如:
Linux hostname 3.10.0-1160.el7.x86_64 #1 SMP ... x86_64 x86_64 x86_64 GNU/Linux
它看不出来是 "CentOS / Ubuntu / Debian",只能看出:
Linux:说明是 Linux 内核
3.10.0-1160.el7:内核版本号

参数说明
shell
-A 将所有的视窗都调整为目前终端机的大小。
-d <作业名称> 将指定的screen作业离线。
-h <行数> 指定视窗的缓冲区行数。
-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称> 恢复离线的screen作业。
-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s 指定建立新视窗时,所要执行的shell。
-S <作业名称> 指定screen作业的名称。
-v 显示版本信息。
-x 恢复之前离线的screen作业。
-ls或--list 显示目前所有的screen作业。
-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。
-A 将所有的视窗都调整为目前终端机的大小。

-d 将指定的screen作业离线。

-h <行数> 指定视窗的缓冲区行数。

-m 即使目前已在作业中的screen作业,仍强制建立新的screen作业。

-r <作业名称> 恢复离线的screen作业。

-R 先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。

-s 指定建立新视窗时,所要执行的shell。

-S <作业名称> 指定screen作业的名称。

-v 显示版本信息。

-x 恢复之前离线的screen作业。和-r类似,但支持多个终端同时"附着"在同一个screen会话上


-ls或--list 显示目前所有的screen作业。

-wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业。

列出所有screen会话 screen -ls
Detached = 后台挂着,人没在看,Attached = 正有人在看(占着)

screen -d -r xxx -d, -r都作用在xxx上

There is a screen on:1502688.myjob (Attached)There is no screen to be resumed.

如果你就是那个正在 Attached 的终端本人,在里面再敲 screen -r myjob,那通常会直接黑屏一下,然后"什么都没发生",因为你已经在那个会话里了。
screen -r 显示attached的screen,或者提示 There is a screen on:xx都表示这个会话正被某个终端占着


新建screen
screen

直接screen 会新建一个screen会话,名字时xxx.pts-x.xxxx,分别是screen进程的id,所在终端的名字,主机名





screen -S name


screen -r 重新连接到 screen 会话
screen -r




screen -r 跟「会话名」(你用 -S 起的名字)

##screnn -r 跟「ID」(前面的数字,也就是 PID)

中止 screen 会话
在 screen 里面 结束会话的几种方法
只杀当前窗口
Ctrl + d/exit

Ctrl + a 然后 k

一次性干掉整个 screen 会话:Ctrl + a 然后 \

在 screen 外面 结束会话的方法
screen -S xxx -X quit


顺带再帮你强调一下"退出"和"离开"的区别

在每个screen session 下,命令都以 ctrl+a开始
ctrl+a d 暂时离开当前session
shell
ctrl-a d # detach,暂时离开当前session,
# 当前 screen 会话继续在后台跑
# 你退回到进 screen 前的那个 shell 提示符
# screen 进程还在,所以:
# 里面所有前台/后台的程序都继续跑
# 即使你 logout / Xshell 关掉 / 电脑关机,只要服务器不重启,它们都活着
# 之后可以screen -r 再回去
ctrl+a z
ctrl-a z # 把当前session放到后台执行,用 shell 的 fg 命令则可回去。

窗口操作
Ctrl+a+w: 展示当前会话中的所有窗口;

Ctrl+a+c: 创建一个新的窗口,相当于在同一个 screen 里开一个新的终端
创建新窗口(新的 shell)。
👉 比喻:在同一个 screen 房间里又摆了一台新电脑

Ctrl+a+n: 切换至下一个窗口;

Ctrl+a+p: 切换至上一个窗口;

Ctrl+a+num: 切换至编号为num的窗口;

ctrl+a ctrl+a

Ctrl+a+k: 杀死当前窗口;

复制 / 粘贴(copy mode
https://www.cnblogs.com/mchina/archive/2013/01/30/2880680.html

