screen命令简要说明
screen命令有什么用
screen命令虚拟了一个终端(session),可在终端内运行命令,多次运行screen命令可以虚拟多个不同的终端;
每个session可以开启多个窗口,每个窗口有自己的shell,可以在不同的窗口中同时运行多个命令,每个命令都相当于在前台运行,可以与用户交互;
为什么要用screen命令
- 防止终端关闭时产生的SIGHUP信号导致程序退出;一般终端关闭时,会对从该终端启动的进程发送SIGHUP信号,如果程序没有特殊处理,就会导致进程终止,使用screen来启动进程,screen本身已经对SIGHUP信号做了处理,不会导致进程退出,仅是screen detach了,以后还可以重新attach到screen进程;当然,如果仅仅是应付SIGHUP信号,也可以使用nohup命令,但nohup命令有两个弊端:一是nohup.out文件的无限增长可能导致长时间后磁盘空间用尽;二是使用nohup后无法与进程进行终端交互,这通常也是使用screen的最主要的原因。
- 使用screen可以在终端退出后,为进程保留一个虚拟终端,从而再次连接到终端,attach到screen后,还可以继续与进程进行交互操作。
- 对于只能有一个终端连接的情况(例如串口),可以方便的开启多个窗口,同时运行多个交互命令
启动screen
screen [ -options ] [ cmd [ args ] ]
启动screen,screen会启动一个进程SCREEN,这个进程才是真正用于模拟终端的程序,称之为一个会话(session),当前执行的screen命令则附着到session,进行终端交互。
session命令默认开启一个窗口,在窗口中执行命令,如果不指定命令cmd,session进程会启动一个shell进程,用户与shell进程进行交互,否则直接执行cmd命令,shell或者cmd命令结束,窗口也就结束了,所有窗口都结束了,session也就结束了,SCREEN进程自动退出。
开始只有一个窗口,每个session都可以开启多个窗口(参考下文快捷键部分),执行不同的命令,所有窗口的命令都结束,所有窗口都关闭后,session才会结束。
使用-d -m
选项可以启动session,但不attach上去,这个方式在系统启动脚本中可以确保启动脚本不会被命令卡住(相当于在后台执行命令),而后续还可以attach上去查看命令的状态,与命令交互。同样其他脚本需要启动一个以后需要与用户交互的命令时也可以使用此方法。
查看有哪些screen进程
screen -ls
screen -list
两个命令等同,列出当前已经启动的screen进程(session),包括进程名、启动时间和附着状态。
进程名可以用于其他操作session的命令,默认是pid.tty.host
格式,如果使用-S sessionname
选项在启动时指定了sessionname,则是pid.sessionname
格式。
推荐使用sessionname方式,可以更直观的说明session中运行的是什么任务,方便后续查看和交互
附着到现有的screen
screen -r [[pid.]tty[.host]]
注意,这里可以省略pid和host,仅指定tty,在只有一个该tty的session时相当于指定了全名,如果有多个会给出列表,提示用户输入全名。
如果有其他人已经attach到了这个session,可以使用-d -r
选项先detach再attach;
使用-d -R
,如果有指定的session就attach(必要时先detach),否则就创建一个session。
常用快捷键
screen中的快捷键全部以一个特定的键开始,默认是C-a
(CTRL-A),可以通过命令行选项-e xy
更改。
detach
如果当前正在进行screen交互,想要detach当前的session,可以在session中使用C-a d
或C-a C-d
快捷键
将窗口内容输出到文件
C-a H
开始/结束将当前窗口内容输出到log文件"screenlog.n"
screen就是一个终端窗口,显示的内容有限,log到文件可以保存更多内容,修改窗口缓存行可使用-h num
选项,也可以在命令行用-L
直接开启log输出
开启多窗口
执行screen命令的同时,开启了一个窗口,连接到当前的运行的命令;想要再开启一个新窗口时可以在当前窗口中使用快捷键C-a c
或C-a C-c
,新窗口中会运行一个新的shell进程。注意:新窗口与原窗口属于同一个session,对应同一个SCREEN进程;同一个session的窗口之间可以切换,复制内容等,不同session的窗口无法交互
在窗口间切换
C-a space
或C-a n
或C-a C-n
切换到下一个窗口;
C-a backspace
或C-a C-h
或C-a p
或C-a C-p
切换到前一个窗口;
销毁当前窗口
C-a k
或C-a C-k
销毁全部窗口,结束当前session
C-a \
查看attach到当前session的所有终端
screen允许多个进程使用-x
选项attach到同一个session,在session中使用C-a *
快捷键可以列出attach到当前session的所有终端,包括每个终端的分辨率等,session会以比较小的分辨率运行,在分辨率大的窗口中以虚线标出实际使用的范围