screen

在多个进程(通常是交互式shell)之间复用物理终端,用于命令行终端切换.

语法:

开始屏幕会话:

  screen [ -options ] [ cmd [args] ]

恢复屏幕会话:

  screen -r [[pid.]tty[.host]]

  screen -r sessionowner/[[pid.]tty[.host]]

常用screen参数

screen -S    screenName    -> 新建一个叫screenName的session
screen -ls                 -> 列出当前所有的session
screen -r    screenName    -> 回到screenName这个session
screen -d    screenName    -> 远程detach某个session
screen -d -r screenName    -> 结束当前session并回到screenName这个session

选项:



   -A -[r|R]     使所有窗口适应新的显示宽度和高度
   -c file       读取配置文件
   -d (-r)       将指定screen作业离线
   -dmS name     作为守护程序启动:处于分离模式的屏幕会话
   -D (-r)       远程分离和注销
   -D -RR        执行重新连接屏幕会话所需的操作
   -d -m         以“detached”模式启动。对系统启动脚本很有用
   -D -m         以“detached”模式启动,并且不分叉新进程。
   -list         列出目前所有的screen作业
   -r            恢复离线的screen作业.
   -R            先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业
   -t title      设置标题(窗口的名字)
   -U            告诉屏幕使用UTF-8编码
   -x            恢复之前离线的screen作业
   -X            在指定的会话中执行cmd作为screen命令

交互式命令(默认键绑定):

 Control-a ?    显示简要帮助
 Control-a "    列出所有窗口以供选择
 Control-a '    提示要切换到的窗口名称或号码
 Control-a 0    选择窗口0
 Control-a 1    选择窗口1
 ...            ...
 Control-a 9    选择窗口9
 Control-a A    接受当前窗口的标题名称
 Control-a b    向窗口发送一个中断
 Control-a c    创建运行shell的新窗口
 Control-a C    清除屏幕
 Control-a d    终端分离屏幕。
 Control-a D D  分离和注销。
 Control-a f    开关或自动
 Control-a F    将窗口大小调整为当前区域大小
 Control-a h    将当前窗口的硬拷贝写入文件 "hardcopy.n"
 Control-a H    将当前窗口的开始/结束日志记录到文件  "screenlog.n"
 Control-a i    显示有关此窗口的信息.
 Control-a k    Kill(Destroy)当前窗口.
 Control-a l    完全刷新当前窗口
 Control-a M    监视活动的当前窗口{切换开/关}
 Control-a n    切换到下一个窗口
 Control-a N    显示窗口的编号和标题
 Control-a p    切换到上一个窗口
 Control-a q    将control-q发送到当前窗口(xon)
 Control-a Q    删除除当前区域之外的所有区域。(仅限)
 Control-a r    切换当前窗口的换行设置(换行)
 Control-a s    将control-s发送到当前窗口(xoff)
 Control-a w    显示窗口列表(窗口)
 Control-a x    锁定此终端(锁定屏幕)
 Control-a X    杀死当前区域(删除)
 Control-a Z    将虚拟终端重置为其 "power-on" 值 
 Control-a Control-\    杀死所有窗口并终止屏幕(退出)
 Control-a :    进入命令行模式(冒号)
 Control-a [    [输入复制/回滚模式(复制)
 Control-a ]    将粘贴缓冲区的内容写入stdin(粘贴)
 Control-a _    监控当前窗口是否不活动{切换开/关}
 Control-a *    显示所有当前连接的显示的列表。

当调用屏幕时,它会创建一个单独的窗口,其中包含一个shell(或指定的命令),然后不再使用,以便您可以像往常一样使用该程序。
然后,您可以随时:

 创建新的(全屏)窗口(包括更多的shell)

 杀死现有的窗口

 查看窗口列表

 在窗口之间切换 - 所有窗口都完全独立地运行程序。当窗口当前不可见时,即使整个屏幕会话与用户终端分离,程序也会继续运行。

上面的交互式命令采用默认的键绑定。您可以通过在主目录中创建〜/ .screenrc文件来修改屏幕设置。这可以更改默认击键,绑定功能键F11,F12甚至设置一个程序/窗口加载,以便在您启动屏幕时立即运行。

要在登录时自动启动screen ,请将 .profile 文件设置为:

exec screen

附加和分离

 屏幕运行后,切换到任何正在运行的窗口并键入 Control-a d. 这将从该终端分离屏幕. 
 现在,转到另一台机器,打开一个shell,ssh到机器运行屏幕(你刚从中分离出来的那个),
 然后输入: % screen -r
 这将重新连接到会话。就像魔术一样,你的会话会恢复运行,就像你从未离开过一样。

完全退出屏幕

  当所有窗口都被杀死时,screen将自动退出

 关闭正在运行的程序或键入“Exit”退出shell,包含它的窗口将被屏幕杀死。
 (如果此窗口位于前景,则显示将切换到上一个窗口)
 当没有剩下时,screen 退出。

此页面只是可用选项的摘要,请输入man screen以获取更多信息

使用 screen

安装screen

   $ yum install screen

查询screen 是否安装

    $ rpm -qa | grep screen
    screen-4.1.0-0.23.20120314git3c2946.el7_2.x86_64

创建一个新的名为daxia的screen

 $ screen -S daxia

查看窗口和窗口名称,窗口id

 $ screen -ls
 4767.daxia      (Detached)
 1488.beifen     (Detached)
 2 Sockets in /var/run/screen/S-root.

重新连接会话

 $ screen -r daxia
 或
 $ screen -r 4767

清除dead 会话,如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),
这时screen -list会显示该会话为dead状态。
使用screen -wipe命令清除该会话

 $ screen -wipe

关闭或杀死窗口

正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。

除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

会话共享

假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

 screen -x

这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

会话锁定与解锁

Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

发送命令到screen会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

 screen -S moodi -X screen ping www.rootopen.com

这个命令在一个叫做moodi 的screen会话中创建一个新窗口,并在其中运行ping命令。

屏幕分割

现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a 在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。

可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。

C/P模式和操作

screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a 或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

screen 命令实例:

linux命令:screen -X -S 2134 quit quit 2134 -S -X screen screen -X -S 2134 quit rootopen.com
linux命令:screen -X -S 2134 quit quit 2134 -S -X screen screen -X -S 2134 quit rootopen.com
2018-10-29 09:46:27

linux命令:screen -X -S [sessionname] quit quit [sessionname] -S -X screen screen -X -S [sessionname] quitrootopen.com
linux命令:screen -X -S [sessionname] quit quit [sessionname] -S -X screen screen -X -S [sessionname] quitrootopen.com
2018-10-05 22:26:45

linux命令:screen -ls | grep main && urxvt -name screen -e screen -x main || urxvt -name screen -e screen -R -S main main -S -R screen -e screen -name urxvt || main -x screen -e screen -name urxvt && main grep | -ls screen screen -ls | grep main && urxvt -name screen -e screen -x main || urxvt -name screen -e screen -R -S mainrootopen.com
linux命令:screen -ls | grep main && urxvt -name screen -e screen -x main || urxvt -name screen -e screen -R -S main main -S -R screen -e screen -name urxvt || main -x screen -e screen -name urxvt && main grep | -ls screen screen -ls | grep main && urxvt -name screen -e screen -x main || urxvt -name screen -e screen -R -S mainrootopen.com
2018-01-10 02:58:48

linux命令:screen -xR -xR screen screen -xRrootopen.com
linux命令:screen -xR -xR screen screen -xRrootopen.com
2018-02-01 11:31:48

linux命令:screen -ls | grep pts | gawk '{ split($1, x, "."); print x[1] }' | while read i; do gnome-terminal -e screen\ -dx\ $i; done done $i; -dx\ screen\ -e gnome-terminal do i; read while | }' x[1] print "."); x, split($1, '{ gawk | pts grep | -ls screen screen -ls | grep pts | gawk '{ split($1, x, "."); print x[1] }' | while read i; do gnome-terminal -e screen\ -dx\ $i; donerootopen.com
linux命令:screen -ls | grep pts | gawk '{ split($1, x, "."); print x[1] }' | while read i; do gnome-terminal -e screen\ -dx\ $i; done done $i; -dx\ screen\ -e gnome-terminal do i; read while | }' x[1] print "."); x, split($1, '{ gawk | pts grep | -ls screen screen -ls | grep pts | gawk '{ split($1, x, "."); print x[1] }' | while read i; do gnome-terminal -e screen\ -dx\ $i; donerootopen.com
2018-01-04 16:52:48

linux命令:screen -d -m [<command>] [<command>] -m -d screen screen -d -m [<command>]rootopen.com
linux命令:screen -d -m [<command>] [<command>] -m -d screen screen -d -m [<command>]rootopen.com
2018-04-29 22:03:48

linux命令:screen -dmS "name_me" echo "hi" "hi" echo "name_me" -dmS screen screen -dmS "name_me" echo "hi"rootopen.com
linux命令:screen -dmS "name_me" echo "hi" "hi" echo "name_me" -dmS screen screen -dmS "name_me" echo "hi"rootopen.com
2018-01-13 21:28:48

linux命令:screen -d -m nautilus --no-desktop `pwd` `pwd` --no-desktop nautilus -m -d screen screen -d -m nautilus --no-desktop `pwd`rootopen.com
linux命令:screen -d -m nautilus --no-desktop `pwd` `pwd` --no-desktop nautilus -m -d screen screen -d -m nautilus --no-desktop `pwd`rootopen.com
2018-01-01 11:53:48

linux命令:screen -x -x screen screen -xrootopen.com
linux命令:screen -x -x screen screen -xrootopen.com
2018-02-03 20:28:48

linux命令:screen -x -x screen screen -xrootopen.com
linux命令:screen -x -x screen screen -xrootopen.com
2018-04-14 10:58:48

linux命令:screen -raAd -raAd screen screen -raAdrootopen.com
linux命令:screen -raAd -raAd screen screen -raAdrootopen.com
2017-12-25 09:57:48

linux命令:screen -d -m command & & command -m -d screen screen -d -m command &rootopen.com
linux命令:screen -d -m command & & command -m -d screen screen -d -m command &rootopen.com
2018-01-09 01:49:48

linux命令:screen /dev/tty<device> 9600 9600 /dev/tty<device> screen screen /dev/tty<device> 9600rootopen.com
linux命令:screen /dev/tty<device> 9600 9600 /dev/tty<device> screen screen /dev/tty<device> 9600rootopen.com
2018-02-21 02:08:48

linux命令:screencast() { arecord -R 1000 -f cd -t wav $1.wav & RECPID=$!; echo "Starting screencast in new shell. Exit subshell to quit."; script -t 2> $1.timing -a $1.session; kill $RECPID; } } $RECPID; kill $1.session; -a $1.timing 2> -t script quit."; to subshell Exit shell. new in screencast "Starting echo RECPID=$!; & $1.wav wav -t cd -f 1000 -R arecord { screencast() screencast() { arecord -R 1000 -f cd -t wav $1.wav & RECPID=$!; echo "Starting screencast in new shell. Exit subshell to quit."; script -t 2> $1.timing -a $1.session; kill $RECPID; }rootopen.com
linux命令:screencast() { arecord -R 1000 -f cd -t wav $1.wav & RECPID=$!; echo "Starting screencast in new shell. Exit subshell to quit."; script -t 2> $1.timing -a $1.session; kill $RECPID; } } $RECPID; kill $1.session; -a $1.timing 2> -t script quit."; to subshell Exit shell. new in screencast "Starting echo RECPID=$!; & $1.wav wav -t cd -f 1000 -R arecord { screencast() screencast() { arecord -R 1000 -f cd -t wav $1.wav & RECPID=$!; echo "Starting screencast in new shell. Exit subshell to quit."; script -t 2> $1.timing -a $1.session; kill $RECPID; }rootopen.com
2018-03-14 17:57:48

linux命令:screen /dev/ttyS0 9600 9600 /dev/ttyS0 screen screen /dev/ttyS0 9600rootopen.com
linux命令:screen /dev/ttyS0 9600 9600 /dev/ttyS0 screen screen /dev/ttyS0 9600rootopen.com
2018-03-05 13:14:48

linux命令:screen -x <screen_id> <screen_id> -x screen screen -x <screen_id>rootopen.com
linux命令:screen -x <screen_id> <screen_id> -x screen screen -x <screen_id>rootopen.com
2018-06-09 21:53:48

linux命令:screen -ls | grep D D grep | -ls screen screen -ls | grep Drootopen.com
linux命令:screen -ls | grep D D grep | -ls screen screen -ls | grep Drootopen.com
2018-04-03 19:56:48

linux命令:screen -x `screen -ls | grep Detached | cut -c -10` -10` -c cut | Detached grep | -ls `screen -x screen screen -x `screen -ls | grep Detached | cut -c -10`rootopen.com
linux命令:screen -x `screen -ls | grep Detached | cut -c -10` -10` -c cut | Detached grep | -ls `screen -x screen screen -x `screen -ls | grep Detached | cut -c -10`rootopen.com
2018-05-31 17:10:48

linux命令:screen -RR -RR screen screen -RRrootopen.com
linux命令:screen -RR -RR screen screen -RRrootopen.com
2018-02-03 15:53:48

linux命令:screen -D -R -R -D screen screen -D -Rrootopen.com
linux命令:screen -D -R -R -D screen screen -D -Rrootopen.com
2018-05-07 13:18:48

linux命令:screen -S [name] -d -m [<command>] [<command>] -m -d [name] -S screen screen -S [name] -d -m [<command>]rootopen.com
linux命令:screen -S [name] -d -m [<command>] [<command>] -m -d [name] -S screen screen -S [name] -d -m [<command>]rootopen.com
2018-03-13 19:12:48

linux命令:screen -x $(screen -ls | awk 'NR == 2 { print $1 }') }') $1 print { 2 == 'NR awk | -ls $(screen -x screen screen -x $(screen -ls | awk 'NR == 2 { print $1 }')rootopen.com
linux命令:screen -x $(screen -ls | awk 'NR == 2 { print $1 }') }') $1 print { 2 == 'NR awk | -ls $(screen -x screen screen -x $(screen -ls | awk 'NR == 2 { print $1 }')rootopen.com
2018-02-09 10:44:48

linux命令:screen !! !! screen screen !!rootopen.com
linux命令:screen !! !! screen screen !!rootopen.com
2018-05-14 15:14:48

linux命令:screen -r irc || screen -S irc irssi irssi irc -S screen || irc -r screen screen -r irc || screen -S irc irssirootopen.com
linux命令:screen -r irc || screen -S irc irssi irssi irc -S screen || irc -r screen screen -r irc || screen -S irc irssirootopen.com
2018-05-31 02:12:48

linux命令:screen -R -D -S sessionname -q -q sessionname -S -D -R screen screen -R -D -S sessionname -qrootopen.com
linux命令:screen -R -D -S sessionname -q -q sessionname -S -D -R screen screen -R -D -S sessionname -qrootopen.com
2018-04-03 18:00:48

linux命令:screen screen screenrootopen.com
linux命令:screen screen screenrootopen.com
2018-01-27 04:32:48

linux命令:screen -X eval "chdir $PWD" $PWD" "chdir eval -X screen screen -X eval "chdir $PWD"rootopen.com
linux命令:screen -X eval "chdir $PWD" $PWD" "chdir eval -X screen screen -X eval "chdir $PWD"rootopen.com
2018-01-11 14:03:48

Linux的Bash命令行(A-Z排序)