taoCMS是基于php+sqlite/mysql的国内最小(100Kb左右)的功能完善的CMS管理系统

screen 和 tmux 的使用详解

2013-05-06

01) screen
01-02) 使用 screen 管理你的远程会话
你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连 接,否则这个任务就会被杀掉,一切半途而废了。
元凶:SIGHUP 信号
让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。
在Linux/Unix中,有这样几个概念:
进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。
根据POSIX.1定义:
挂断信号(SIGHUP)默认的动作是终止程序。
当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
如果会话期首进程终止,则该信号发送到该会话期前台进程组。
一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。
因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。
我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。
在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。
ps -ef|grep top
root      5180  5128  0 01:03 pts/0    00:00:02 top
root      5857  3672  0 01:12 pts/2    00:00:00 grep top


使用pstree命令可以更清楚地看到这个关系:
pstree -H 5180|grep top
|-sshd-+-sshd---bash---top
            
使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。
ps -xj|grep 5128
 5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
 5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
 3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128


关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。
ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128


如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标 准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用 标记&把它放在后台运行。
nohup [argument…] &


虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。


简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可 以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen 中创建一个新的窗口有这样几种方式:
1.直接在命令行键入screen命令
screen


Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。
2.Screen命令后跟你要执行的程序。
screen vi test.c


Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。
3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。
screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:
[root@tivf06 ~]# screen vi /tmp/abc


之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:
暂时中断会话
半个小时之后回来了,找到该screen会话:
[root@tivf06 ~]# screen -ls
There is a screen on:
        16582.pts-1.tivf06      (Detached)
1 Socket in /tmp/screens/S-root.


重新连接会话:
[root@tivf06 ~]# screen -r 16582


看看出现什么了,太棒了,一切都在。继续干吧。
你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前 screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫 做键绑定(key binding),C-a叫做命令字符(command character)。
可以通过C-a ?来查看所有的键绑定,常用的键绑定有:


C-a ? 显示所有键绑定信息
C-a w 显示所有窗口列表
C-a ' 提示输入将要切换到下一个窗口的窗口名
C-a " 显示当前会话中的所有窗口
C-a C-a 切换到之前显示的窗口
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n 切换到下一个窗口
C-a p 切换到前一个窗口(与C-a n相对)
C-a 0..9 切换到窗口0..9
C-a a 发送 C-a到当前窗口
C-a d 暂时断开screen会话
C-a D D 断开screen会话,并退出登录sheel
C-a k 杀掉当前窗口
C-a [ 进入拷贝/回滚模式(在screen的窗口中进行翻页,快捷键与vi相同,ESC退出翻页)
    进入拷贝模式后,按选中开始点,再次按选中结束点
C-a ] 粘贴
C-a a Screen嵌套使用时(当前主机A中用Screen建立会话后,再远程到服务器B中打开Screen会话),向screen窗口发送C-a命令。一般后接一个常规命令,如“C-a a "“
C-a A 修改当前窗口的标题名
C-a C 清屏当前窗口


Screen常用选项
使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:
因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:
-exy x为命令字符,y为转义命令字符的字符
下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。
        screen -e^tt
自定义命令字符和转义字符
其他常用的命令选项有:
-c file 使用配置文件file,而不使用默认的$HOME/.screenrc
-d|-D [pid.tty.host] 不开启新的screen会话,而是断开其他正在运行的screen会话
-h num 指定历史回滚缓冲区大小为num行
-list|-ls 列出现有screen会话,格式为pid.tty.host
-d -m 启动一个开始就处于断开模式的会话
-r sessionowner/ [pid.tty.host] 重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
-S sessionname 创建screen会话时为会话指定一个名字
-v 显示screen版本信息
-wipe [match] 同-list,但删掉那些无法连接的会话
下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r 重新连接上:
[root@tivf18 root]# screen –ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Detached)
2 Sockets in /root/.screen.


[root@tivf18 root]# screen –r 8736


如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:
         kill -9 8462
screen -ls  
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen.


   screen -wipe
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Removed)
1 socket wiped out.
1 Socket in /root/.screen.


  screen -ls  
There is a screen on:
        8736.pts-1.tivf18       (Detached)
1 Socket in /root/.screen.


-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname
启动一个初始状态断开的screen会话:
screen -dmS mygdb gdb execlp_test


连接该会话:
screen -r mygdb


自动连接到系统中的Screen会话中的第1个会话:
screen -D -R 


管理你的远程会话
先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到 系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接 了。让我们使用screen来试试。
SSH登录到系统,在命令行键入screen。
screen
在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:
管理你的远程会话
然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。
是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次 登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗 口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r 就可以了。
最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:
putty
使用telnet:
telnet
更多Screen功能
Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME /.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。 如果你愿意的话,也可以自己指定screen配置文件。
以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文 件内容请参考screen的man页。


01-02) Bug
[root@dns1 ~]# screen -v
Screen version 4.00.03 (FAU) 23-Oct-06
[root@dns1 ~]# lsb_release  -a
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.4 (Final)
Release: 5.4
Codename: Final
screen 在CentOS 5.4系统下(虚拟机Vmware7.1, 256M内存,单核CPU),在源代码安装apache-2.2.22后进行压力测试时(ab -t 120 -c 100 -n 1000 http://192.168.0.135/)直接失去响应,待apache压力测试完后,再次从ssh或者在vmware窗口中用screen -D -R 连接时仍然无响应!!!
02) tmux (tmux-1.4)
02-01) INSTALL:
02-01-02) source_install:
tmux依赖libevent和ncurses


libevent-2.0.10-stable.tar.gz
(CentOS-5_rpm:libevent-1.1a-3.2.1  libevent-devel-1.1a-3.2.1版本无法满足“evbuffer_add_vprintf"函数)
ncurses-devel-5.7-3.20090208.el6.i686.rpm
(rhel-6-i386-dvd.iso)


tar xzvf libevent-2.0.10-stable-tar.gz
cd libevent-2.0.10-stable
./configure && make && make install
ln -s  /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
(yum install libevent-devel CentOS-5_rpm:libevent-1.1a-3.2.1  libevent-devel-1.1a-3.2.1版本无法满足“evbuffer_add_vprintf"函数,tmux安装后必须完成以上链接才能使用)
yum install ncurses-devel


[root@dns1 ~]# tar xzvf tmux-1.4.tar.gz
[root@dns1 ~]# cd tmux-1.4
[root@dns1 tmux-1.5]# configure && make && make install
[root@dns1 tmux-1.5]# tmux ls
tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
[root@dns1 tmux-1.5]# ln -s  /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
[root@dns1 tmux-1.5]#  tmux


02-01-02) binary_install
sudo apt-get install tmux


02-02) how_to
KEY BINDINGS
     tmux may be controlled from an attached client by using a key combination
     of a prefix key, ‘C-b’ (Ctrl-b) by default, followed by a command key.
The default command key bindings are:


           C-b         Send the prefix key (C-b) through to the application.
           C-o         Rotate the panes in the current window forwards.
           C-z         Suspend the tmux client.
           !           Break the current pane out of the window.
           "           Split the current pane into two, top and bottom.
           #           List all paste buffers.
           %           Split the current pane into two, left and right.
           &           Kill the current window.
           ’           Prompt for a window index to select.
           ,           Rename the current window.
           -           Delete the most recently copied buffer of text.
           .           Prompt for an index to move the current window.
           0 to 9      Select windows 0 to 9.
           :           Enter the tmux command prompt.
           ;           Move to the previously active pane.
           =           Choose which buffer to paste interactively from a list.
           ?           List all key bindings.
           D           Choose a client to detach.
           [           Enter copy mode to copy text or view the history.
           ]           Paste the most recently copied buffer of text.
           c           Create a new window.
           d           Detach the current client.
           f           Prompt to search for text in open windows.
           i           Display some information about the current window.
           l           Move to the previously selected window.
           n           Change to the next window.
           o           Select the next pane in the current window.
           p           Change to the previous window.
           q           Briefly display pane indexes.
           r           Force redraw of the attached client.
           s           Select a new session for the attached client interactively.
           L           Switch the attached client back to the last session.
           t           Show the time.
           w           Choose the current window interactively.
           x           Kill the current pane.
           {           Swap the current pane with the previous pane.
           }           Swap the current pane with the next pane.
           ~           Show previous messages from tmux, if any.
           Page Up     Enter copy mode and scroll one page up.
           Up, Down
           Left, Right
                       Change to the pane above, below, to the left, or to the
                       right of the current pane.
           M-1 to M-5  Arrange panes in one of the five preset layouts: even-
                       horizontal, even-vertical, main-horizontal, main-verti-
                       cal, or tiled.
           M-n         Move to the next window with a bell or activity marker.
           M-o         Rotate the panes in the current window backwards.
           M-p         Move to the previous window with a bell or activity
                       marker.
           C-Up, C-Down
           C-Left, C-Right
                       Resize the current pane in steps of one cell.
           M-Up, M-Down
           M-Left, M-Right
Resize the current pane in steps of five cells.


     Key bindings may be changed with the bind-key and unbind-key commands.


根据tmux的定义,在开启了tmux服务器后,会首先创建一个会话,而这个会话则会首先创建一个窗口,其中仅包含一个面板;也就是说,这里看到的所谓终端控制台应该称作tmux的一个面板,虽然其使用方法与终端控制台完全相同。
tmux使用C/S模型构建,主要包括以下单元模块:
server 服务器。输入tmux命令时就开启了一个服务器。 
session 会话。一个服务器可以包含多个会话。 
window 窗口。一个会话可以包含多个窗口。 
pane 面板。一个窗口可以包含多个面板。 


操作
类似各种平铺式窗口管理器,tmux使用键盘操作,常用快捷键包括: 
Ctrl+b  激活控制台;此时以下按键生效 


系统操作 
?  列出所有快捷键;按q返回 
d  脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 
D  选择要脱离的会话;在同时开启了多个会话时使用 
Ctrl+z  挂起当前会话 
r  强制重绘未脱离的会话 
s  选择并切换会话;在同时开启了多个会话时使用 
:  进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器 
[  进入复制/卷屏模式;此时的操作与emacs相同,按q/Esc退出、Ctrl+@设定标记开始,Ctrl+V下一屏Alt+V上一屏, 
] 进入粘贴模式;
~  列出提示信息缓存;其中包含了之前tmux返回的各种提示信息 


窗口操作 
c  创建新窗口 
&  关闭当前窗口 
数字键  切换至指定窗口 
p  切换至上一窗口 
n  切换至下一窗口 
l  在前后两个窗口间互相切换 
w  通过窗口列表切换窗口 
,  重命名当前窗口;这样便于识别 
.  修改当前窗口编号;相当于窗口重新排序 
f  在所有窗口中查找指定文本 


面板操作 
”  将当前面板平分为上下两块 
%  将当前面板平分为左右两块 
x  关闭当前面板 
!  将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板 
Ctrl+方向键  以1个单元格为单位移动边缘以调整当前面板大小 
Alt+方向键  以5个单元格为单位移动边缘以调整当前面板大小 
Space  在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled 
q  显示面板编号 
o  在当前窗口中选择下一面板 
方向键  移动光标以选择面板 
{  向前置换当前面板 
}  向后置换当前面板 
Alt+o  逆时针旋转当前窗口的面板 
Ctrl+o  顺时针旋转当前窗口的面板 


shell>tmux ls
显示已有会话(tmux list-session)
shell>tmux a
连接到之前断开的会话(tmux attach-session)
shell>tmux a -t 0/1/2
连接到之前断开的某一个会话0/1/2


02-03) Bug



类别:技术文章 | 阅读:209346 | 评论:0 | 标签:screen tmux linux

想收藏或者和大家分享这篇好文章→

“screen 和 tmux 的使用详解”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

公告

taoCMS发布taoCMS 3.0.2(最后更新21年03月15日),请大家速速升级,欢迎大家试用和提出您宝贵的意见建议。

捐助与联系

☟请使用新浪微博联系我☟

☟在github上follow我☟

标签云