laravel执行流程

 

laravel其实通过管道模式,经过三组中间件,第一组,系统自带的,设置cookie,验证一类的;第二组是路由定义的中间件,第三组就是控制器定义的中间件,以下是流程

rabbitMq 安装

  • 安装rabbitmq,必须安装erlang,安装可以下载安装包,也可以下载rpm 文件安装,rabbitmq官网提供了erlang的安装文件,过程中可能会遇到一些问题查看
    1. 问题查看http://thrillerzw.iteye.com/blog/2111335
    2. 下载地址 http://www.rabbitmq.com/releases/erlang/
    3. 版本对照表,下载指定版本的 erlang
    4. 安装 yum install erlang-19.0.4-1.el7.centos.x86_64.rpm
    5. 安装过程 ,提示错误,少了那些依赖包,可参考: http://www.51itong.net/centos6-5-erlang-6590.html
  • 安装 rabbitMq
    1. 下载地址 : http://www.rabbitmq.com/releases/rabbitmq-server/
    2. 安装 : yum install rabbitmq-server-3.6.10-1.el7.noarch.rpm

tip:可以用yum安装,可能版本比较老

配置

  • rabbitmq 安装后,默认的配置
    1. 数据库路径 : /var/lib/rabbitmq
    2. 配置文件路径 : /etc/rabbitmq, 其中,环境配置文件 /etc/rabbitmq/rabbitmq-env.conf 位置不能变,/etc/rabbitmq/rabbitmq.config,可以通过环境变量配置 CONFIG_FILE=/usr/local/etc/rabbitmq/rabbitmq
      NODE_IP_ADDRESS=127.0.0.1
      NODENAME=rabbit-xiaofang
  • 日志路径 : /var/log/rabbitmq ,可以查看插件加载,启动的服务,配置文件在哪,有没有加载配置文件等
  • 安装web 管理插件 rabbitmq-plugins enable rabbitmq_managemen
    rabbitmq-plugins disable rabbitmq_managemen
    访问 http://localhost:15672可以查看web管理界面,
    > tips : 从3.4 以后的版本,guest,就只能本机访问了,外部访问不了,推荐添加新的用户和角色,来管理界面
  • 配置外部访问 [
    {rabbit,[
    {tcp_listeners, [5672]}
    ]
    }
    ].
  • 启动服务 : rabbitmq-server -detached, 启动一个守护进程,后台运行
  • 新建用户和授权 rabbitmqctl add_user admin admin123
    rabbitmqctl set_user_tags admin administrator //给用户赋予角色
    rabbitmqctl list_user //查看用户
    rabbitmqctl list_vhosts
    rabbitmqctl add_vhost xiaofang
    rabbitmqctl set_permissions -p xiaofang admin '.*' '.*' '.*' // set_permissions [-p <vhostpath>] <user> <conf> <write> <read>
    rabbitmqctl list_user_permissions admin //查看某个用户权限

概念

概念

  1. product、exchange、binding、queue 、custome 之间的关系
    [图片]()
    [关系]()
  2. Exchange type : fanout、direct 、topic、headers、
  • fanout类型的Exchange路由规则非常简单,它会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中 – direct类型的Exchange路由规则也很简单,它会把消息路由到那些binding key与routing key完全匹配的Queue中。 – opic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchage相似,也是将消息路由到binding key与routing key相匹配的Queue中,但这里的匹配规则有些不同,它约定: – outing key为一个句点号“. ”分隔的字符串(我们将被句点号“. ”分隔开的每一段独立的字符串称为一个单词),如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit” binding key与routing key一样也是句点号“. ”分隔的字符串 – binding key中可以存在两种特殊字符“”与“#”,用于做模糊匹配,其中“”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

客户端使用

  1. 查看队列里面的内容
  2. 没有用到超时机制。RabbitMQ仅仅通过Consumer的连接中断来确认该Message并没有被正确处理。也就是说,RabbitMQ给了Consumer足够长的时间来做数据处理。
  3. queue也可以自动删除,被标为auto-delete的queue在最后一个Consumer unsubscribe后就会被自动删除。那么如果是创建一个已经存在的queue呢?那么不会有任何的影响。需要注意的是没有任何的影响,也就是说第二次创建如果参数和第一次不一样,那么该操作虽然成功,但是queue的属性并不会被修改
  4. 如果queue不存在,当然Consumer不会得到任何的Message。但是如果queue不存在,那么Producer Publish的Message会被丢弃。所以,还是为了数据不丢失,Consumer和Producer都try to create the queue!反正不管怎么样,这个接口都不会出问题。
  5. queue也可以自动删除,被标为auto-delete的queue在最后一个Consumer unsubscribe后就会被自动删除。
  6. rabbitMq默认是公平分发,RabbitMQ将第n个Message分发给第n个Consumer。当然n是取余后的。它不管Consumer是否还有unacked Message,只是按照这个默认机制进行分发。 prefetch_count=1 (channel.basic_qos(prefetch_count=1) )通过这个设置,可以是客户端,同一时间最多处理一个message,这种方法可能会导致queue满。当然,这种情况下你可能需要添加更多的Consumer,或者创建更多的virtualHost来细化你的设计。
  7. queue 和exchange 创建完之后,就不会改变了, 但是可以修改queue 的binding key
  8. 要建立 binding key ; exchange,要一起设置

rabbitmq 对象属性

exchange属性

  1. Type : exchange类型fanout、direct、topic、header
  2. Durability : 持久性,这是exchange的可选属性,如果你Durability设置为false,那些当前会话结束的时候,该exchange也会被销毁。    新建一个transient exchange
  3. Auto delete: 当没有队列或者其他exchange绑定到此exchange的时候,该exchange被销毁。这个很简单就不示例了。
  4. Internal:表示这个exchange不可以被client用来推送消息,仅用来进行exchange和exchange之间的绑定。

Queue 属性

  1. Durability和exchange相同,未持久化的队列,服务重启后销毁。
  2. Auto delete : 当没有消费者连接到该队列的时候,队列自动销毁。
  3. Exclusive :使队列成为私有队列,只有当前应用程序可用,当你需要限制队列只有一个消费者,这是很有用的。
  4. Message TTL :在队列自动删除之前可以保留多长时间(对应扩展参数argument “x-expires”)
  5. Max length : 一个队列可以容纳的已准备消息的数量(对应扩展参数argument “x-max-length”) ps:一旦创建了队列和交换机,就不能修改其标志了。例如,如果创建了一个non-durable的队列,然后想把它改变成durable的,唯一的办法就是删除这个队列然后重现创建。

Message 属性

  1. Durabillity : 消息的持久在代码中设置的方法与exchange和queue不同, (DeliveryMode=2)
  2. contentType: 标识消息内容的MIME,例如JSON用application/json
  3. replayTo : 标识回调的queue的地址
  4. correlationId :用于request和response的关联,确保消息的请求和响应的同一性
  5. 状态
  • Ready : 此状态的消息存在于队列中待处理。 – Unacknowledged : 此状态的消息表示已经在处理未确认。 6.

vim 多窗口操作

一、打开文件

  1. vim  index.html index.php a.txt  :打开3个文件

2. vim -o index.html index.php a.txt :  水平分割打开3个文件  -O 垂直分割

  1. vim -p index.html index.php a.txt : 打开3个文件,有tab选项卡,tab卡第一个文件名为当前打开的文件

二、基本命令

:e# 或 Ctrl+ˆ      编辑上一个文档,用于两个文档相互交换编辑时使用。?# 代表的是编辑前一次编辑的文档

:n          编辑下一个文档。

:2n        编辑下两个文档。

:N          编辑上一个文档。注意,该方法只能用于同时打开多个文档。

:b          文档名或编号      移至该文档。

Ctrl+6    下一个文件

:bn         下一个文件

:bp        上一个文件

:f          或者 ctrl+g     :  显示当前文件的基本信息

:f         文档名         改变编辑中的文档名。(file) ,  保存后生成一个新文件, 原来文件内容不变

三、多窗口下

(1) :ls    查看打开的文件

  1.  %a  正在编辑的文件,  #a 上次编辑的文件的文件  a 正常

  2.  后面一个有一个 + 号,表示有修改,没有保存

(2) 切换窗口

  1.  ctrl+w w   依次切换窗口

  2.  ctrl+w  上下左右   hjkl   切换窗口

  3.  ctrl +w   HJKL  可以移动窗口

(3) 关闭窗口

  1. 多窗口下面 :

:q 关闭单个窗口

:qa 关闭所有窗口

  1. ctrl + w  q  : 关闭所处分屏

  2. :only 或者 ctrl+w  o   取消其他分屏,只保留当前分屏

(4) :e 文件 : 打开一个文件

(5) 新建分屏

:new 文件 : 水平分割,打开文件

:sp(split)  文件 : 水平分割,打开指定文件
:vsp(vsplit)  文件 : 垂直分割,打开指定文件

:sv  : 水平分割

:vs : 垂直分割

 

打开当前文件:

ctrl+w 和 s(split)

ctrl+w 和 v(vsplit)

(6) 改变分屏尺寸的操作了。

ctrl+w 和 < 左

ctrl+w 和 > 右

ctrl+w 和 + 上

ctrl+w 和 – 下

ctrl+w 和 = 恢复均等(

这里顺便简单提一下复制,剪切与粘贴操作命令

yy     复制光标所在行

dd     剪切光标所在行

d0  或者 d^   删除光标到行开始的内容

d$  删除光标到行结束的位置

5yy    复制从光标所在行开始计数的下五行文本

5dd    剪切从光标所在行开始计数的下五行文本

v(小写)      visual模式,通过上下左右键选择光标“扫过”的所有字符

V (大写)    visual line 模式,通过上下键选择光标“扫过”的所有行

ctrl + v        visual block 模式,通过上下左右键选择一个矩形文本

y    复制在visual模式, visual line模式和visual block 模式下选择的文本

d    剪切在visual模式, visual line模式和visual block 模式下 选择的文本

p(小写)  粘贴,  粘贴位置为光标所在行的下一行

P(大写)  粘贴,  粘贴位置为光标所在行的上一行

u: 撤销操作

r: 重做操作

提示:

(1) 假若我们通过vim打开了多个文件后,想在不关闭vim的情况下继续打开其他文件,如文件file,可在vim中使用如下命令:

:e  file   不会分割窗口

:sp  file  将会水平分割窗口

:vsp  file  将会垂直分割窗口

(2)  vim和shell之间切换

:shell   切换到shell,此时vim在后台运行,在shell中输入命令exit,切换回vim

(3)  在vim中执行shell命令(不切换到shell)

:!command        在执行的命令前加上!,如!ls ,!ls -a
 r  !command       将command命令的执行结果插入到文本当前行的下一行
 3  !command      将文本中第三行的内容输入到命令command中进行处理,并将第三行的内容替换为命令的执行结果
:1,3   !command    将文本中第一行到第三行的内容输入到命令command中进行处理,并将第一行到第三行的内容替换为命令的执行结果
 3  w !command      将文本中第三行的内容输入到命令command中进行处理,不改变当前编辑文件的内容.

:1,3  w  !command    将文本中第一行到第三行的内容输入到命令command中进行处理,不改变当前编辑文件的内容

vim的基本操作

vim的基本操作

基本操作

移动光标的方法

  1. 光标
  • h 或 向左箭头键(←) :光标向左移动一个字符

  • j 或 向下箭头键(↓) :光标向下移动一个字符

  • k 或 向上箭头键(↑) :光标向上移动一个字符

  • l 或 向右箭头键(→) : 光标向右移动一个字符

    • : 光标移动到非空格符的下一列
  • 光标移动到非空格符的上一列

  • n<space> : 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20<space> 则光标会向后面移动20 个字符距离。

  • 0 或功能键[Home] : 这是数字『 0 』:移动到这一行的最前面字符处 (常用)

  • ^ : 移动到这一行的开始的字符处

  • $ 或功能键[End] : 移动到这一行的最后面字符处(常用)

  1. 翻页
  • [Ctrl] + [f] : 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用)

  • [Ctrl] + [b] : 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用)

  • [Ctrl] + [d] : 屏幕『向下』移动半页

  • [Ctrl] + [u] : 屏幕『向上』移动半页

  1. 页面光标
  • H : 光标移动到这个屏幕的最上方那一行的第一个字符

  • M : 光标移动到这个屏幕的中央那一行的第一个字符

  • L : 光标移动到这个屏幕的最下方那一行的第一个字符

  • G : 移动到这个档案的最后一行(常用)

  • nG : n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu)

  • 移动到这个档案的第一行,相当于 1G 啊! (常用)

搜索与取代

  1. 搜索
  • /word: 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻vbird 这个字符串,就输入 /vbird 即可! (常用)

  • ?word : 向光标之上寻找一个字符串名称为 word 的字符串。

  • n : 这个 n 是英文按键。代表『重复前一个搜寻的动作』。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串!

  • N : 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。

  1. 替换
  • :n1,n2 s/word1/word2/g: n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻vbird 并取代为 VBIRD 则:『:100,200s/vbird/VBIRD/g』。(常用)

  • :1,$s/word1/word2/g: 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !(常用)

  • :1,$s/word1/word2/gc : 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用)

删除、复制与贴上

  1. 删除
  • x, X : 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)

  • nx : n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。

  • dd : 删除游标所在的那一整列(常用)

  • ndd : n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)

  • dnG [x] : 删除光标所在到第n行之间的所有数据

  • dG : 删除光标所在到最后一行的所有数据

  • d$ : 删除游标所在处,到该行的最后一个字符

  1. 复制和粘贴
  • yy : 复制游标所在的那一行(常用)

  • nyy : n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制 20 列(常用)

  • ynG : 复制光标所在列到第一列的所有数据

  • yG : 复制光标所在列到最后一列的所有数据

  • y0 : 复制光标所在的那个字符到该行行首的所有数据

  • y$ : 复制光标所在的那个字符到该行行尾的所有数据

  • p, P : p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)

  1. 其他指令
  • J : 将光标所在列与下一列的数据结合成同一列

  • c : 重复删除多个数据,例如向下删除 10 行,[ 10cj ]

  • u : 复原前一个动作。(常用)

  • [Ctrl]+r : 重做上一个动作。(常用)

一般模式切换到编辑模式的可用的按钮说明

  1. 进入插入或取代的编辑模式
  • i, I : 进入插入模式(Insert mode):i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空格符处开始插入』。 (常用)

  • a,A : 进入插入模式(Insert mode):a 为『从目前光标所在的下一个字符处开始插入』, A 为『从光标所在行的最后一个字符处开始插入』。(常用)

  • o,O : 进入插入模式(Insert mode):这是英文字母 o 的大小写。o 为『在目前光标所在的下一行处插入新的一行』; O 为在目前光标所在处的上一行插入新的一行!(常用)

  • r, R : 进入取代模式(Replace mode):r 只会取代光标所在的那一个字符一次;R 会一直取代光标所在的文字,直到按下 ESC 为止;(常用)

  • [Esc] : 退出编辑模式,回到一般模式中(常用)

指令列模式的可用的按钮说明

  1. 指令列的储存、离开等指令
  • :w : 将编辑的数据写入硬盘档案中(常用)

  • :w! : 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊!

  • :q : 离开 vi (常用)

  • :q! : 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。

  • :wq! : 储存后离开,若为 :wq! 则为强制储存后离开 (常用)

  • ZZ : 这是大写的 Z 喔!若档案没有更动,则不储存离开,若档案已经被更动过,则储存后离开!

  • :w [filename] : 将编辑的数据储存成另一个档案(类似另存新档)

  • :r [filename] : 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面

  • :n1,n2 w [filename] : 将 n1 到 n2 的内容储存成 filename 这个档案。

  • :! command : 暂时离开 vi 到指令列模式下执行 command 的显示结果!例如『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息!

  1. vim 环境的变更
  • set nu : 显示行号,设定之后,会在每一行的前缀显示该行的行号

  • set nonu : 与 set nu 相反,为取消行号!

tips

  1. 特别注意,在 vi 中,『数字』是很有意义的!数字通常代表重复做几次的意思! 也有可能是代表去到 第几个什么什么的意思。举例来说,要删除 50 行,则是用 『50dd』 对吧! 数字加在动作之前~那我 要向下移动 20 行呢?那就是『20j』或者是『20↓』即可。

额外功能

区块选择

  1. v : 字符选择,会将光标经过的地方反白选择!

  2. V : 行选择,会将光标经过的行反白选择!

  3. [Ctrl]+v : 区块选择,可以用长方形的方式选择资料

  4. y : 将反白的地方复制起来

  5. d : 将反白的地方删除

多档案编辑的按键

  1. :n : 编辑下一个档案

  2. :N : 编辑上一个档案

  3. :files : 列出目前这个 vim 的开启的所有档案

多窗口情况下的按键功能

1 . 多窗口

  • :sp [filename] : 开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)。

  • [ctrl]+w+ j [ctrl]+w+↓ : 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j (或向下箭头键),则光标可移动到下方的窗口。

  • [ctrl]+w+ k [ctrl]+w+↑ : 同上,不过光标移动到上面的窗口。

  • [ctrl]+w+ q : 其实就是 :q 结束离开啦! 举例来说,如果我想要结束下方的窗口,那么利用 [ctrl]+w+↓ 移动到下方窗口后,按下 :q 即可离开, 也可以按下[ctrl]+w+q 啊!

环境设置与记录

记录

  1. vim 环境设定与记录: ~/.vimrc, ~/.viminfo

vim 的环境设定参数

  1. 环境设置
  • :set nu :set nonu : 就是设定与取消行号啊!

  • :set hlsearch :set nohlsearch : hlsearch 就是 high light search(高亮度搜寻)。 这个就是设定是否将搜寻的字符串反白的设定值。默认值是 hlsearch

  • :set autoindent :set noautoindent : 是否自动缩排?autoindent 就是自动缩排。

  • :set backup : 是否自动储存备份档?一般是 nobackup 的, 如果设定 backup 的话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为filename~ 的档案。 举例来说,我们编辑 hosts ,设定 :set backup ,那么当更动 hosts 时,在同目录下,就会产生 hosts~ 文件名的档案,记录原始的 hosts 档案内容

  • :set ruler : 还记得我们提到的右下角的一些状态栏说明吗? 这个 ruler 就是在显示或不显示该设定值的啦!

  • :set showmode : 这个则是,是否要显示 –INSERT– 之类的字眼在左下角的状态栏。

  • :set backspace=(012) : 一般来说, 如果我们按下 i 进入编辑模式后,可以利用退格键(backspace) 来删除任意字符的。 但是,某些 distribution 则不许如此。此时,我们就可以透过 backspace 来设定啰~ 当 backspace 为 2时,就是可以删除任意值;0 或 1 时,仅可删除刚刚输入的字符, 而无法删除原本就已经存在的文字了!

  • :set all : 显示目前所有的环境参数设定值。

  • :set : 显示与系统默认值不同的设定参数, 一般来说就是你有自行变动过的设定参数啦!

  • :syntax on :syntax off : 是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文本档时,如果开头是以 # 开始,那么该行就会变成蓝色。 如果你懂得写程序,那么这个 :syntax on 还会主动的帮你除错呢!但是, 如果你仅是编写纯文本档案,要避免颜色对你的屏幕产生的干扰,则可以取消这个设定。

  • :set bg=dark :set bg=light : 可用以显示不同的颜色色调,预设是『 light 』。如果你常常发现批注的字体深蓝色实在很不容易看, 那么这里可以设定为 dark 喔!试看看,会有不同的样式呢!

  1. vim的默认配置一般 在 /etc/vimrc 里面,但一般在 ~/.vimrc (如果没有的话,可以自行建立)里面设置自定义个性化设置

  2. 出现乱码

  • 你的 Linux 系统默认支持的语系数据:这与 /etc/sysconfig/i18n 有关;

  • 你的终端界面 (bash) 的语系: 这与 LANG 这个变数有关;

  • 你的档案原本的编码;

  • 开启终端机的软件,例如在 GNOME 底下的窗口接口。

DOS 与 Linux 的断行字符

  1. 区别
  • linux断行符 : $ (LF)

  • window 断行符 :^M$ (CR/LF)

  1. 系统换行问题
  • Dos和windows: 采用回车+换行CR/LF表示下一行.

  • UNIX/Linux : 采用换行符LF表示下一行.

  • MAC OS : 采用回车符CR表示下一行.

  1. dos2unix unix2dos : dos和linux文档转化

  2. iconv : 编码转化

  • iconv –list : 查看系统支持的编码方式

linux screen

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

  • 会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
  • 多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
  • 会话共享
Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。

GNU’s Screen 官方站点:http://www.gnu.org/software/screen/

三、语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]

参数说明

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或–list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

四、常用screen参数

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

在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a ? -> 显示所有键绑定信息
C-a c -> 创建一个新的运行shell的窗口并切换到该窗口
C-a n -> Next,切换到下一个 window
C-a p -> Previous,切换到前一个 window
C-a 0..9 -> 切换到第 0..9 个 window
Ctrl+a [Space] -> 由视窗0循序切换到视窗9
C-a C-a -> 在两个最近使用的 window 间切换
C-a x -> 锁住当前的 window,需用用户密码解锁
C-a d -> detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z -> 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w -> 显示所有窗口列表
C-a t -> Time,显示当前时间,和系统的 load
C-a k -> kill window,强行关闭当前的 window
C-a [ -> 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode
C-a ] -> Paste,把刚刚在 copy mode 选定的内容贴上

五、使用 screen

5.1 安装screen

流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#

5.2 创建一个新的窗口

安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

[root@TS-DEV ~]# screen -S david

screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

[root@TS-DEV ~]# screen vi david.txt

screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。

5.3 查看窗口和窗口名称

打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:

0$ bash  1-$ bash  2*$ bash

这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。

Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。

5.4 会话分离与恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:

[root@TS-DEV ~]# screen vi /tmp/david.txt

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:

暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@TS-DEV ~]# screen -ls

重新连接会话:

[root@TS-DEV ~]# screen -r 12865

一切都在。

当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。

这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

5.5 清除dead 会话

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

5.6 关闭或杀死窗口

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

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

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

六、screen 高级应用 

6.1 会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[root@TS-DEV ~]# screen -x

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

6.2 会话锁定与解锁

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

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

6.3 发送命令到screen会话

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

[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com

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

6.4 屏幕分割

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

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

6.5 C/P模式和操作

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

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

6.6 更多screen功能

同大多数UNIX程序一样,GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg…)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

shell 运算符

一、算数运算符

算术运算符列表
运算符 说明 举例
+ 加法 `expr $a + $b` 结果为 30。
减法 `expr $a – $b` 结果为 10。
* 乘法 `expr $a \* $b` 结果为  200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

二、关系运算符

关系运算符列表
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

三、布尔运算符

布尔运算符列表
运算符 说明 举例
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

四、字符串运算符

字符串运算符列表
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -z $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

五、文件测试运算符

文件测试运算符列表
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是具名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

终端快捷键操作

在shell命令终端中,Ctrl+n相当于方向向下的方向键,Ctrl+p相当于方向向上的方向键。
在命令终端中通过它们或者方向键可以实现对历史命令的快速查找。这也是快速输入命令的技巧。
在命令终端中可以通过Ctrl+r 实现快速检索使用过的历史命令。Ctrl+r中r是retrieve中r。
Ctrl+a:光标回到命令行首。 (a:ahead)
Ctrl+e:光标回到命令行尾。 (e:end)
Ctrl+b:光标向行首移动一个字符。 (b:backwards)
Ctrl+ f:光标向行尾移动一个字符。 (f:forwards)
Ctrl+w: 删除光标处到行首的字符。
Ctrl+k:删除光标处到行尾的字符。
Ctrl+u:删除整个命令行文本字符。
Ctrl+h:向行首删除一个字符。
Ctrl+d:向行尾删除一个字符。
Ctrl+y::粘贴Ctrl+u,Ctrl+k,Ctrl+w删除的文本。
Ctrl+p: 上一个使用的历史命令。 (p:previous)
Ctrl+n: 下一个使用的历史命令。(n:next )
Ctrl+r:快速检索历史命令。(r:retrieve)。
Ctrl+t: 交换光标所在字符和其前的字符。
Ctrl+i:相当于Tab键。
Ctrl+o:相当于Ctrl+m.
Ctrl+m:相当Enter键。
其他控制键:
Ctrl+s:使终端发呆,静止,可以使快速输出的终端屏幕停下来。
Ctrl+q:退出Ctrl+s引起的发呆。
Ctrl+z:使正在运行在终端的任务,运行于后台。 (可用fg恢复)
Ctrl+c:中断终端中正在执行的任务。
Ctrl+d: 在空命令行的情况下可以退出终端。
Ctrl+[ :相当于Esc键。
Esc键:连续按3次显示所有的支持的终端命令。
Tab键:命令、文件名等自动补全功能。

linux tree 命令

tree

中文解释:tree
功能说明:以树状图列出目录的内容。
语  法:tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录…]
补充说明:执行tree指令,它会列出指定目录下的所有文件,包括子目录里的文件。
参  数:
 -a   显示所有文件和目录。
 -A   使用ASNI绘图字符显示树状图而非以ASCII字符组合。
 -C   在文件和目录清单加上色彩,便于区分各种类型。
 -d   显示目录名称而非内容。
 -D   列出文件或目录的更改时间。
 -f   在每个文件或目录之前,显示完整的相对路径名称。
 -F   在执行文件,目录,Socket,符号连接,管道名称名称,各自加上”*”,”/”,”=”,”@”,”|”号。
 -g   列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
 -i   不以阶梯状列出文件或目录名称。
 -I<范本样式>   不显示符合范本样式的文件或目录名称。
 -l   如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
 -n   不在文件和目录清单加上色彩。
 -N   直接列出文件和目录名称,包括控制字符。
 -p   列出权限标示。
 -P<范本样式>   只显示符合范本样式的文件或目录名称。
 -q   用”?”号取代控制字符,列出文件和目录名称。
 -s   列出文件或目录大小。
 -t   用文件和目录的更改时间排序。
 -u   列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
 -x   将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

 

然后看我遇到的情况:

tree -L
提示: tree: Missing argument to -L option
然后tree -L 1
显示一级目录和文件
tree -L 1 -d
只显示一级目录
所以我们可以用tree -L 1 -d这个显示该目录下的一级目录