在使用ssh或者telnet登录远程主机后执行一些耗时的命令, 如果此时ssh或者telnet中断, 那么远程主机上正在执行的程序或者说命令也会被迫终止.
screen能够很好地解决这个问题, screen也叫虚拟终端, 可以在一个物理终端上实现多个虚拟终端的效果.
创建screen会话
# 新建一个screen
screen
# 新建一个screen并指定名称
screen -S XXX
以上命令, screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切退到前一个窗口。使用screen开启一个串口终端
screen /dev/ttyUSB0 9600,cs8
带命令创建窗口
# screen命令后跟你要执行的程序。
screen vi test.c
screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话
以上两种方式都创建新的screen会话。
在一个已有screen会话中创建新的窗口。在当前screen窗口中键入Ctrl + A, C,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口
断开(detach)screen会话,并重连(attach)会话
#打开一个screen窗口编辑/tmp/abc文件:
screen vi /tmp/abc
之后暂时退出做点别的事情,在screen窗口键入Ctrl + A, D,Screen会给出detached提示, 这时候可以在命令行执行其他命令
# 半个小时之后回来了,找到该screen会话:
screen -ls
There is a screen on:
16582.pts-1.tivf06 (Detached)
1 Socket in /tmp/screens/S-root.
# 重新连接会话
screen -r 16582
这时候会显示出原来screen会话中的信息.
如果原screen还是Attached的状态, 需要用 -x 参数
# 重新连接一个还在Attached状态的screen session
screen -x 16582
如果意外中断了连接中的screen, 例如网络中断了, 再次登录后无法用-r 连接会原来的screen, 可以用-D参数解除, 之后就可以继续用-r连接了
# 如果只有一个screen
screen -D
# 如果有多个
screen -D 1636.pts-21.hostname
也可以直接组合-r -d连接
screen -r -d 30608.pts-21
screen的组合键操作列表
Ctrl-a ? 显示所有键绑定信息
Ctrl-a w 显示所有窗口列表
Ctrl-a C-a 切换到之前显示的窗口
Ctrl-a c 创建一个新的运行shell的窗口并切换到该窗口
Ctrl-a n 切换到下一个窗口
Ctrl-a p 切换到前一个窗口(与C-a n相对)
Ctrl-a 0..9 切换到窗口0..9
Ctrl-a a 发送 C-a到当前窗口
Ctrl-a d 暂时断开screen会话
Ctrl-a k 杀掉当前窗口
Ctrl-a [ 进入拷贝/回滚模式
screen命令的参数
Options:
-4 Use IPv4.
-6 Use IPv6.
-a Force all capabilities into each window's termcap.
-A -[r|R] Adapt all windows to the new display width & height.
-c file Read configuration file instead of '.screenrc'.
-d (-r) Detach the elsewhere running screen (and reattach here).
-dmS name Start as daemon: Screen session in detached mode.
-D (-r) Detach and logout remote (and reattach here).
-D -RR Do whatever is needed to get a screen session.
-e xy Change command characters.
-f Flow control on, -fn = off, -fa = auto.
-h lines Set the size of the scrollback history buffer.
-i Interrupt output sooner when flow control is on.
-l Login mode on (update /var/run/utmp), -ln = off.
-list or -ls. Do nothing, just list our SockDir.
-L Turn on output logging.
-m ignore $STY variable, do create a new screen session.
-O Choose optimal output rather than exact vt100 emulation.
-p window Preselect the named window if it exists.
-q Quiet startup. Exits with non-zero return code if unsuccessful.
-r Reattach to a detached screen process.
-R Reattach if possible, otherwise start a new session.
-s shell Shell to execute rather than $SHELL.
-S sockname Name this session <pid>.sockname instead of <pid>.<tty>.<host>.
-t title Set title. (window's name).
-T term Use term as $TERM for windows, rather than "screen".
-U Tell screen to use UTF-8 encoding.
-v Print "Screen version 4.00.03 (FAU) 23-Oct-06".
-wipe Do nothing, just clean up SockDir.
-x Attach to a not detached screen. (Multi display mode).
-X Execute <cmd> as a screen command in the specified session.
查看screen line buffer参数: Ctrl+A, i
设置screen line buffer: Ctrl+A, : , 然后输入 scrollback 1000 , 回车
查看buffer内容: Ctrl+A, Esc, 然后就可以用滚轮, 上下箭头等操作屏幕上下移动了, 翻页则使用Ctrl+F, Ctrl+B, 再次按Esc则退出