Linux命令之Screen后台运行
一、 简介
Screen 用于命令行终端切换,用户可以通过该命令同时连接多个本地或远程的命令行会话,并在其间自由切换,在 screen
环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出
状态
使用 Screen
命令可开启一个另一个会话(终端),终端有两种状态
Attached
激活态,表示该终端作为主终端正在被使用Detached
非激活态,表示该终端在后台运行
如下
1 | $ screen -ls |
类似工具 Tmux
二、 安装
一般都预装了,没有就安装
1 | apt -y install screen |
三、 语法
1 | screen [选项] [作业名称] |
选项 | 注释 |
---|---|
-a | 强制将所有功能放入每个窗口的termcap |
-A | 将所有的窗口都调整为目前终端机的大小 |
-c | 指定配置文件,默认 .screenrc |
-d | 将指定的会话离线 |
-D | 将指定的会话离线并注销远程登录用户 |
-h | 指定缓冲区行数 |
-i | 流量控制开启时,中断输出更快 |
-l | 登录模式打开 |
-ls, -list | 显示目前所有的 Screen作业 |
-L | 打开输出日志记录 |
-Logfile | 输入日志路径 |
-m | 忽略 $STY 变量,创建一个新的屏幕会话 |
-O | 选择最佳输出 |
-r | 恢复指定会话 |
-R | 先试图恢复离线的会话,若没有则新会话 |
-s | 指定执行的 Shell 环境,如 -s /bin/bash |
-S | 创建指定名称的会话 |
-t | 设置标题 |
-U | |
-wipe | 删除无法使用的离线作业 |
-x | 恢复之前离线的作业 |
-X |
快捷键
在每个会话下,所有命令都以按键 Ctrl+a (C-a)
开始
快捷键 | 注释 |
---|---|
C-a ? | 显示所有键绑定信息 |
C-a c | 创建会话 |
C-a A | 来为当前窗口重命名 |
C-a n | 切换到下一个窗口 |
C-a p | 切换到前一个窗口 |
C-a 0..9 | 切换到第 0..9 个窗口 |
C-a [Space] | 由 窗口0 循序切换到窗口9 |
C-a C-a | 在两个最近使用的 窗口间切换 |
C-a x | 锁住当前 窗口,需用用户密码解锁 |
C-a d | 保存会话,后台运行 |
C-a z | 把当前窗口放到后台执行,用 fg 命令回去 |
C-a w | 显示所有窗口列表 |
C-a t | 显示时间 |
C-a k | 关闭对话 |
四、使用
新建终端
直接输入 screen
回车,即可新建一个虚拟终端,但是这样的名称太乱,以Linux的 hostname
命名
1 | $ screen -ls |
创建一个名为 2bacc
的窗口
1 | screen -S 2bacc |
执行后会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen了
方法2
而我一般是使用 -R
创建虚拟终端
1 | screen -R 3bacc |
区别
创建方法区别
- 使用
-R
创建,如果之前有创建同名的screen,则直接进入之前创建的screen - 使用
-S
创建和直接输入screen创建的虚拟终端,不会检录之前创建的screen(也就是会创建同名的screen)
执行命令
也可以在 screen
命令后面加入要执行的命令
1 | screen vim david.txt |
当退出 vim 将退出该窗口/会话
查看窗口
打开多个窗口后,可以使用 快捷键 C-a w
列出当前所有窗口
如果使用文本终端,这个列表会列在屏幕左下角,如果使用 X
环境下的终端模拟器,这个列表会列在标题栏里
开启三个窗口,其中 *
号表示当前位于 窗口2
,-
号表示上一次切换窗口时位于 窗口1
1 | 0-$ bash 1-$ bash 2*$ bash |
可以使用快捷键 C-a A
来为当前窗口重命名,按下快捷键后,输入新的名字,回车确认
回到终端
你可以不中断程序的运行而暂时断开(detach
),并在随后时间重新连接(attach
)该会话,重新控制各窗口中运行的程序
例如,打开一个会话窗口编辑 hello.txt
文件
1 | screen vim hello.exe |
之后我们想暂时退出做点别的事情,比如出去散散步,可以按下快捷键 C-a d
会给出提示
1 | [detached from 2048.pts-0.localhost] |
半个小时之后回来了,找到该会话
1 | $ sudo screen -ls |
重新连接会话,一切都在
1 | screen -r 2048 |
区别
大小写使用区别
- 使用
-r
回到指定会话,如果不存在,则不操作 - 使用
-R
回到指定会话,如果不存在,则自动创建新的虚拟终端
退出会话
比较推荐的方法,是进入对应虚拟终端,然后输入
1 | exit |
之后,就会回到主终端
当然,也可以在主终端内,使用命令释放
1 | # 使用 -R/-r/-S 均可 |
方法2
如果由于某种原因其中一个会话死掉了,这时 screen -ls
会显示该会话为 Dead
状态
1 | $ screen -ls |
清除该会话
1 | $ screen -wipe |
再次查看,已经清除掉 Dead
会话了
1 | $ sudo screen -ls |
方法3
另一个关闭窗口的方法是使用 C-a k
这个 快捷键 杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程
会话共享
假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个s会话,你朋友可以在他的终端上命令
1 | screen -x |
这个命令会将你朋友的终端 Attach
到你的Screen会话上,并且你的终端不会被断开(Detach)。这样你就可以和朋友共享同一个会话了
如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。
会话锁定与解锁
Screen 允许使用快捷键 C-a s
锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键 C-a q
可以解锁一个会话
也可以使用 C-a x
锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话
发送命令到会话
在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利
在 sandy 的 screen 会话中创建一个新窗口并运行ping
命令
1 | screen -S sandy -X screen ping www.baidu.com |
屏幕分割
可以使用快捷键 C -a S
将显示器水平分割,也支持垂直分屏,快捷键是 C-a |
。分屏以后,可以使用 C-a <tab>
在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。、
可以用 C-a X
快捷键关闭当前焦点所在的屏幕区块,也可以用 C-a Q
关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它