linux screen.md

https://www.ibm.com/developerworks/cn/linux/l-cn-screen/index.html

会话操作

screen  # 创建会话,直接键入screen,启动默认shell
screen -S yourname   # 新建叫yourname的session
screen -r yourname   # 恢复离线的screen作业.
screen -d yourname   # 离线某个screen作业.
screen -d -r test  # 强制将这个会话从它所在的终端分离,转移到新的终端上来
screen vi test  # 创建会话,Screen命令后跟你要执行的程序,退出vi时同时退出screen会话
screnn -d -m  # 启动一个开始就处于断开模式的会话,可以跟 -S 参数
-m  # 即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-x  # 恢复之前离线的screen作业
screen -d -r yourname #  结束当前session并回到yourname这个session
screen -ls    # 查看会话列表
screen -r id  # 重新连接

kill id  # 直接杀死会话
kill -9 id  # 杀死会话,会话状态变dead
screen -wipe  # 清除状态为dead的会话

窗口操作

ctrl+a,c  # 创建一个新的运行shell的窗口并切换到该窗口
ctrl+a,d    # 暂时断开当前会话
Ctrl+a,?    # 显示所有键绑定信息
Ctrl+a,w    # 显示所有窗口列表
Ctrl+a,Ctrl-a    # 切换到之前显示的窗口
Ctrl+a,n    # 切换到下一个窗口
Ctrl+a,p    # 切换到前一个窗口(与C-a n相对)
Ctrl+a [Space] #  由视窗0循序切换到视窗9
Ctrl+a,0..9    # 切换到窗口0..9
Ctrl+a,a    # 发送 C-a到当前窗口
Ctrl+a,k    # 杀掉当前窗口
Ctrl+a,[    # 进入拷贝/回滚模式
Ctrl+a,]   # 粘贴screen剪贴板中的内容
Ctrl+a,x   # 锁住当前的 window, 需用用户密码解锁
1. 忘记screen会话密码;要么想起来密码,要么kill掉该会话吧;
2. 想换screen会话密码;按下 Ctrl-a 然后再输入 :password 命令,连续输入2次新密码,重新进入即可
Ctrl+a,s  # 锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。
Ctrl+a,q可以解锁一个会话。
Ctrl+a,A    #为当前窗口重命名
Ctrl+a,C    #Clear the screen.
Ctrl+a,S    # 水平分割窗口(分为上下两块).
Ctrl+a,|    # 竖直分割窗口(分为左右两块)
# 新分割出的块跳转过来后需要用Ctrl+a,c来创建新shell.
    Ctrl+a,<Tab>   # 在分割的各块中跳转. 
    Ctrl+a,X       # 关闭分割的块.

C-a t # Time,显示当前时间,和系统的 load 


复制模式

C-a [ : 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vim 一样
    C-b   : Backward,PageUp 
    C-f   : Forward,PageDown 
    H     : (大写) High,将光标移至左上角 
    L     : Low,将光标移至左下角 
    0     : 移到行首 
    $     : 行末 
    w     : forward one word,以字为单位往前移 
    b     : backward one word,以字为单位往后移 
    Space : 第一次按为标记区起点,第二次按为终点 (类似于vim的v选择)
    Esc   : 结束 copy mode 
C-a ] : Paste,把刚刚在 copy mode 选定的内容贴上

窗格操作

CTRL+a,|  # 纵向分割
CTRL+a,S  #  横向分割
CTRL+a,c,#,分割后要,创建新的窗口才能使用
CTRL+a,TAB  # 切换窗格
Ctrl+a,X  #关闭当前焦点所在的屏幕区块
Ctrl+a,Q  #关闭除当前区块之外其他的所有区块

会话共享

screen -x name/id  # 创建一个screen会话,另一个终端上输入

启用共享,不同用户
在当前screen会话窗口按Ctrl + a ,输入冒号:,在冒号后输入multiuser on,回车,就打开了多用户共享开关
授权
授权用户B能够连接A共享的会话:在当前screen会话窗口按Ctrl + a ,输入冒号:,在冒号后输入acladd B,回车即可

脚本

向screen中正在运行的程序发送按键消息
比如screen中正在运行程序top,此时我想从另一个终端中向此screen中的top程序发送终止命令q
# 新建一个名为top的screen并在其中运行top命令
[root@localhost ~]# screen -S top
[root@localhost ~]# top

# 在另一个终端中运行下列指令,然后发现上述top进程终止了
[root@localhost ~]# screen -S top -X stuff "q"
# or
[root@localhost ~]# screen -S top -X stuff "^C"
# 当然也可以发送回车键
[root@localhost ~]# screen -S top -X stuff "^M"



在screen中启动程序
比如,我想在脚本中在某个screen中启动top进程
# 一定要带$,一定要使用单引号
[root@localhost ~]# screen -S top -X stuff $'top\n'
# or
[root@localhost ~]# screen -S top -X stuff "top^M"


如果我们直接在脚本里写 screen -S my_screen, 会导致脚本无法继续执行。为了使脚本执行下去,创建screen的具体代码如下:

screen_name=$"my_screen"
screen -dmS $screen_name
现在,我们就已经创建了一个名为 my_screen 的窗口。然后,我们需要向其发送具体的命令。我们用如下命令:
cmd=$"java Test";
screen -x -S $screen_name -p 0 -X stuff "$cmd"
screen -x -S $screen_name -p 0 -X stuff $'\n'

6.3 发送命令到screen会话

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

[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com
这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。

仅供参考
目录