个人学习

产品经理,超级奶爸

0%

之前一直觉得vim插件好复杂的,太多了,也不知道装哪些好,怎么使用,在这里我简单整理了一下vim的一些常用的插件安装及基本使用,给自己做一个备份,同时给大家做一个参考。

1、SuperTab

SuperTab使键入Tab键时具有上下文提示及补全功能。如下图
SuperTab_1

这个插件的安装比较简单,按以下步骤:

  1. 下载插件,进官网下载,请点击这里
  2. 用Vim打开下载的supertab.vmb文件,比如我下载到了Home目录下Downloads文件夹里,于是使用命令vim ~/Downloads/supertab.vmb打开文件
  3. 打开后,直接敲命令:UseVimball ~/.vim,出现下图所示
    SuperTab_2
  4. 打开vim配置文件,vim ~/.vimrc,在最后加上一行内容

    let g:SuperTabDefaultCompletionType=”context”

  5. OK了,可以拿tab键去尝试了

2、Vundle

插件管理器,方便安装Vim众多插件。

插件管理器的安装方法官方README文档都有,建议直接看文档安装,点击标题进入。鉴于是英文的,这里还是简单的说明一下安装步骤:

  1. 下载Vundle

     mkdir -p ~/.vim/bundle
     cd ~/.vim/bundle
     git clone https://github.com/gmarik/Vundle.vim.git

    没有.vim目录的先创建目录,git下载克隆插件到.vim的bundle目录下
    Vundle_2

  2. 配置各种插件,根据说明文档,敲入下面代码到.vimrc配置文件中就OK了
    Vundle_3
    其实官方说明中,默认给装了很多插件,它是为了教你如何装各种来源的插件,故代码有些长,如下图。

    Vundle_4

这样Vundle这个插件管理器就安装完了。下面紧接着介绍如何用它来安装插件。

3、Syntastic

根据名字,也能大概猜出它是一个语法检测的插件,变量类型写错了、句末分号忘加了(针对需要加分号的语言)等等语法错误都能自动检测出来。如下图所示。
Syntastic_1

这个插件代码是托管在Github上的,点击上面标题进入github地址,按照它的安装说明是需要装一个叫pathogen的插件管理器。但是这里我不这么装,因为个人觉得Vundle更加方便,再说插件管理器之前已经装过了,先入为主嘛。有了插件管理器,下面安装就简单了。

  1. .vimrc文件中加入一句

    Plugin ‘scrooloose/syntastic’

    Syntastic_3

  2. 保存退出,进入vim,输入:PluginInstall,等待下载安装完成
    Syntastic_4

OK,安装插件就是这么简单,保存文件时就会出现错误语法提示,如图有3处错误,光标定位到哪行,下面就显示该行错误提示。
Syntastic_2

4、Auto Pairs

一款简单的括号匹配插件。一件让程序员们抓狂的事是:我是不是少加了最后一个括号?为了处理这个问题,Auto Pairs 这个插件会自动插入和格式化方括号和圆括号。

有了上面的插件管理器Vundle,安装这个插件那就太简单了。将下面这行代码加入.vimrc文件中。

Plugin ‘jiangmiao/auto-pairs’

如图所示
Auto-pairs_1
最后在vim界面上,运行:PluginInstall,等待,大功告成。使用的话,自己去实际中体验吧。也可以点击标题查看说明文档

5、NERD Commenter

如果你在找一个可以支持多种程序语言的注释代码的快捷键,你可以试试 NERD Commenter。即使你不是程序员,也非常非常推荐这款插件,因为它会让你在注释bash脚本或者其他任何东西的时候都会变得非常高效。

使用Vundle插件安装器,安装方法简单到我都不想介绍了,老规矩,在.vimrc中加入下面一句。

Plugin ‘scrooloose/nerdcommenter’

OK了,运行vim,:PluginInstall,真正的轻松拥有。

nerdcommenter_1
使用很简单,但是也得看看官方Usage,不过一般只用到几个就行了,比如

  • \cc 注释当前行
  • \cu 撤销注释行
  • \cs sexily注释,C语言注释效果如上,不过我没看出哪里性感了
  • \cA 行尾注释,切换成输入模式

别看这个插件功能比较简单,但是强大之处就是可以用相同的方法给不同的语言添加注释,比如,bash是#,java是\\等等,很方便,居家旅行必备品。

还有一个插件叫Nerdtree,从名字上可以看出它俩应该是兄弟,同一个开发者开发的。下面紧接着就介绍它。

6、Nerdtree

nerdtree_1
它是一个文件浏览器,管理项目的时候,需要在不同的文件夹中编辑不同的文件代码,那么有了这个插件,你就方便了,不用来回的切换目录了,这样的Vim看起来有点像IDE了。

安装就不多说了,再讲就显得啰嗦了。Github地址请点击标题。它的使用可能需要介绍下,有些插件装完就能用,但是有些还是需要记点快捷键的,至少这个就不会像SuperTab一样简单使用。

进入vim输入:NERDTree默认打开当前目录,当然可以打开指定目录,如:NERDTree /home/打开home目录,完事后敲?,直接显示帮助。下面列出常用的快捷键:

  1. jk分别下、上移动光标
  2. o或者回车打开文件或是文件夹,如果是文件的话,光标直接定位到文件中,想回到目录结构中,按住Ctrl,然后点两下w就回来了
  3. go打开文件,但是光标不动,仍然在目录结构中
  4. is分别是水平、垂直打开文件,就像vim命令的:vs:sp一样
  5. gigs水平、垂直打开文件,光标不动
  6. p快速定位到上层目录
  7. P快速定位到根目录
  8. KJ 快速定位到同层目录第一个、最后一个节点
  9. q 关闭

总结

在这里介绍了6个插件的安装及用法,可以发现一些共性

  1. 下载。大部分插件都是在Github上下载的
  2. 安装。通过插件管理器,安装插件的方式都是一样的
  3. 用法。或看Usage,或:h PluginName查看帮助文档都可以了解它的用法

知道以上三点,差不多就掌握了vim插件的安装与使用了,接下来就是练习了。还有一些插件,诸如Snipmate、Tag List、undotree、gdbmgr、Ctags等,可以自行搜索学习。

欢,迎

激动,盼望

祝贺你,到此校

新的开始,新的希望

美丽的校园,美好的生活

昨日夕阳虽美,明日初阳更甚

放飞梦想的天空,寄予希望的殿堂

拼搏于知识的海洋,翱翔在生活的天空

只要你努力奋斗,成功会对你微笑

聪明在于学习,天才在于积累

多彩的生活,精彩的人生

新的一生,新的未来

愿幸福,伴一生

充实,美满

此,敬

前提

在Linux系统上操作文件,避免不了要使用vim编辑器,传说中的编辑器之神。

我感到非常的惭愧,很长一段时间,我总是觉得使用vim的时候是那么的力不从心,甚至觉得哪有传说中的那么神奇?那是因为我从来没有完整学习过vim,甚至是没有完整看过一遍:help,总觉得一个编辑器有这个必要吗?

平常只是使用vim修改个配置文件什么的,知道h|j|k|l还有io等插入不就行了嘛,直到最近,编写了一些代码才发现,vim不应该这么难用,怎么可能想修改一个字符,要先x删掉,然后i插入,最后esc退出,我觉得肯定有更快捷的方法,不然怎么配上叫“编辑器之神”的称号。

在这里没有高端的使用方法,没有各种牛X插件的介绍,这是非常基础的常用使用技巧,我只是将这些常用的使用技巧做了一个简单地总结,如果其中有一条技巧帮助到了你,那么我就会觉得非常欣慰了。

1、移动

知道h|j|k|l是”左下上右”是远远不够的,还要知道下面这些字符,熟练使用他们会大大提升编辑效率。

  • w 当前光标位置__直到__下一个单词起始处,不包括第一字符

  • e 当前光标位置__直到__单词末尾,包括最后一个字符

  • $ 前光标位置__直到__行尾,包括当前光标位置

  • 0 当前光标位置直到__行首,不包括当前光标位置。__注:这是数字0

  • G 直接跳到文件最后一行

  • gg 直接跳到文件第一行

  • #G 跳到指定的行号数,#代表行号,比如12G直接跳到12行处

    显示行号请使用设置命令:set nu

一定要注意上面解释的用语

  • 直到:它是一个范围,从光标处到下一个光标处的一个范围
  • 包括不包括:可以这么说,移动的路径中是否包括某个位置,为什么这么咬文嚼字,不就是移到下一个单词处或是哪一行嘛,接着往下看,你就会知道原因。

2、删除

可能被了解最多的就是dd命令了吧,它是指删除一行,要删除多行的话,就要加上数字number dd,比如2dd删除两行(包括当前行),如果你想删除一段程序中的一个函数,不知道你会不会先去数一数或是计算一下这个函数有多少行?我就这样干过好长时间。其实它的本质就是d删除指令,下面看一下删除指令d的基本格式。

d number motion
  • number 代表数字
  • motion 代表移动

多说也解释不清楚,下面看实例,当然最好是准备一个文档跟着我一块练习。

  • d2w number为2,motionw,代表删除两个单词,这里自己练习一下,就会体会到上面说的_移动范围_以及_包括不包括_的意思。
  • d$ 没有numbermotion$,代表直接删到行尾,包括当前光标位置。
  • d5G 没有numbermotion5G,删除当前行到第5行之间的内容,包括第5行。
  • dG 没有numbermotionGG代表什么?代表跳到最后一行对不对,那么dG呢?对了,删掉当前行到最后一行内容,包括最后一行。
  • dgg 这个不用解释了吧,呵呵

上面只是举了几个特殊的例子,现在你可以大胆的去拿d命令和移动命令组合了,当你明白了其中的道理,你会发现,何必要用2dd去删除两行呢,使用dj不是更快嘛。你甚至可以通过ggdG来删除全文,所以千万不要去尝试去记住所有的命令,你要记住的只是几个字母而已,哈

3、更改

更改的命令是c,道理完全同删除命令d一样,格式用法都是一样的,不一样的是,c命令会从正常模块直接进入编辑模式。

  • cw 修改一个单词,这里同ce效果一样,结合上面的内容,自己体会一下为什么。
  • c$ 更改从当前光标到行末,还有c0c2w等等命令就不再介绍了,到这里相信你也理解了,而无需我再重复介绍了。

在这里你就会发现,xi命令貌似和cl命令一个意思,都是删掉一个字符,然后进入编辑模式进行替换。我觉得还是挺麻烦的,仅仅为了修改一个字符,就要进入编辑模式,改完了还得esc退出编辑模式,这么做vim都觉得委屈。

还是接着学习吧……

4、字符替换

替换命令,也许你都想到了是什么,删除是d,更改是c,替换当然是r啦,哈哈,对了,就是r,看到没有,大神们就是怕你记不住,根本不用你去记。

好了,穿越到上面的问题去,我现在就想修改一个字符,有没有更快的方法,别让我来回esc了,比如就想将vaid中的a改成o,那么你可以将光标停在字母a上,然后按下替换命令r,接着输入字母o就行了,整个过程完全不用切到编辑模式,而直接替换了字符。

r只是替换一个字符,如果你输入R就可以一直在替换模式,直到按下esc退出为止。

5、复制粘贴

复制命令是y,格式同dc一样,在其后加入移动命令就可以复制指定内容了。下面也只是简单两个例子。

  • y2w 复制两个单词

  • ggyG 复制全文,先用gg命令跳到首行,然后yG,从首行复制到最后一行,就复制全文了。

    d命令类似,yy代表复制当前行,2yy代表复制两行,既然复制完了,如何粘贴呢?

    使用命令p就行了,其实p命令的本质是将vim的寄存器中的内容粘贴出来,这样一讲,你就会明白,剪切该怎么做,剪切不就是删了再粘贴出来吗,使用d命令就可以了,其实vim会把删除的内容存到寄存器中,然后你通过p命令粘贴,就达到了剪切的目的。

    大写Pp的区别只是一个是粘到前面,一个粘到后面而已。

6、搜索匹配

搜索单词hello,在正常模式下输入:/hello就行了,n向下搜索,N向前搜索。

想忽略大小写进行搜索,输入设置命令:set ic就可以了。

7、匹配替换

匹配替换就是word里面的替换功能,如果全篇的void都写成了vaid,总不能一个一个修改吧,于是就有了匹配替换功能。

  • :s/old/new/g 将所在行的old替换成new
  • :%s/old/new/g 整个文件范围内进行替换
  • :%s/old/new/gc 找到每个匹配串,并对每个匹配串提示是否进行替换
  • :#,#s/old/new/g 在若干行范围类进行替换,#代表行号

8、撤销与重做

这里我只想提上一句,撤销命令是u,也就是undo;重做命令为ctrl-r,好了,知道这些够用了。

9、文件

还有一些关于文件操作的小技巧,就总结到下面了

  • :#,# w filename 选择性保存,如:13,14 w filename将文件中13行,14行另存到filename文件中
  • :r filename 插入外部文档,将filename文件内容插入到光标所在下方

10、插入命令

为什么把最基础的命令留到了最后,因为前面的内容实在太精彩了。

  • i&I 光标前插入 & 光标所在行行首插入
  • a&A 光标后插入 & 光标所在行行尾插入
  • o&O 下一行插入 & 上一行插入

结束语

好了,基本上,你现在可以熟练操作vim编辑器了,你会发现肯定比普通编辑器要厉害多了,但是要想达到IDE的效果,那你还得继续努力,学习vim更为强大的命令以及插件。

学会这些命令,你就可以熟练的使用 Git 工具了,什么?想精通,那是不可能的。
基本上,Git 就是以下面的命令顺序学习的。文中笔记是从廖雪峰老师的Git 教程中总结出来的,方面查阅命令。详细原理请看Git教程

1、基础

  • git config --global user.name "Your Name"设置你的仓库用户名(用于标识提交者)
  • git config --global user.email "email@example.com"设置你的仓库邮箱(用于标识提交者)
  • git init 初始化一个git仓库
  • git add --all 添加所有更改的文件
  • git add filename1 当然可以指定添加filename1
  • git commit -m "commit message" 添加更改的信息,必须要有,不然报错,不建议不加。
  • git status 查看git当前状态
  • git diff filename1 查看filename1到底修改了哪些内容
  • git log 查看最近的提交日志
  • git log --pretty=oneline 单行显示提交日志
  • git reset --hard commitID 利用git log得到的commitID返回版本
  • git reset --hard HEAD^回到上一个版本
  • git reflog 查看命令的历史,可以找到git log看不到的commitID,因为git log只显示当前的提交日志,如果你提交了一次,退回版本后又后悔了,就能查看上次提交的commitID
  • git checkout -- filename1 利用版本库中的版本替换工作区中的文件。功能有2:
    • 撤销文件修改,分两种情况:
      • 撤销工作区中的修改(没有使用git add命令添加到暂存区)
      • 撤销暂存区中的修改(添加到了暂存区又做了修改)
    • 找回删除的文件
      • 工作区中文件误删了,可以通过此命令从版本库中找回
  • git reset HEAD filename1 撤销add,回到工作区
  • git rm filename1 删除文件
  • git remote add origin https://github.com/pengloo53/learngit.git 将本地库关联到github远程库上
  • git push -u origin master 第一次推送的时候要加上-u参数,可以将本地库的master分支与远程库的master分支关联起来;下次提交就不需要加-u了。
  • git clone https://github.com/pengloo53/learngit.git 克隆远程库到本地

2、分支管理

  • git checkout -b dev创建dev分支并切换到dev。相当于git branch devgit checkout dev两条命令。
  • git branch查看当前分支
  • git merge dev合并指定分支到当前分支,如,你现在master分支,那么执行命令就将dev分支合并到了master分支上。
  • git branch -d dev删除dev分支
  • git log --graph --pretty=oneline --abbrev-commit查看分支合并图
  • git merge --no-ff -m "merge with no-ff" dev禁用「Fast forward」,也就是保留分支的相关信息。
  • git stash 将工作区现场储藏起来,等以后恢复后继续工作。通常用于处理更为着急的任务时,例如:bug。
  • git stash list 查看保存的工作现场
  • git stash apply恢复工作现场
  • git stash drop 删除stash内容
  • git stash pop 恢复的同时直接删除stash内容
  • git stash apply stash@{0} 恢复指定的工作现场,当你保存了不只一份工作现场时。
  • git branch -D feature-vulcan 强行删除分支。用于不需要合并,就地删除的情况。
  • git remote 查看远程库的信息,一般返回origin。
  • git remote -v 查看远程库的详细信息。
  • git push origin master 将本地master分支推送到远程master分支。
    • master分支为主分支,因此要时刻与远程同步;
    • dev分支为开发分支,团队成员都需要在上面工作,所以也需要与远程同步;
    • bug分支只用于在本地修复bug,没有必要推送到远程;
    • feature新功能分支是否推送到远程,取决于你是否和其他人合作在上面开发。
  • git clone https://github.com/pengloo53/learngit.git 将远程库克隆到本地,默认只能看到master分支。
  • git checkout -b dev origin/dev 创建远程dev分支到本地
  • git pull 将远程分支的最新内容抓取下来。
  • git branch --set-upstream dev origin/dev将本地dev分支与远程dev分支之间建立链接。
  • 删除远程分支:
    • git push origin :<BranchName>
    • git push origin --delete <BranchName>
    • git branch -r -d origin/<BranchName>

多人协作工作模式

  1. 首先,可以试图用git push origin branch-name推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并(如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name);
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

3、标签管理

  • git tag v1.0 给当前分支打上标签
  • git tag 查看所有的标签,按时间顺序列出。
  • git log --pretty=oneline --abbrev-commit缩略commitID并单行显示提交信息
  • git tag v0.9 commitID通过上一条命令查看commitID,然后打上标签。用于忘记打标签的情况,因为标签其实就是只想某个commitID的指针,默认情况下,标签打在最新的提交上。
  • git show v0.9 查看标签信息。
  • git tag -a v0.1 -m "version 0.1 released" commitID创建带有说明的标签,-a指定标签名,-m指定说明文字。
  • git tag -d v0.1 删除标签v0.1
  • git push origin v1.0 推送标签1.0到远程
  • git push origin --tags 推送所有的标签到远程
  • git push origin :refs/tags/v0.9 删除远程标签,但是前提是要先在本地删除对应标签。

4、自定义Git

  • git config --global color.ui true 让Git显示颜色
  • .gitignore在这个文件里编辑你要忽略的文件,并提交到Git中,就可以忽略特殊文件的检查。如将*.db写入.gitignore文件中,将忽略所有db文件。可以参考github收集的所有.gitignore
  • git config --global alias.st status将status的别名设置成st,那么git st=git status
  • git config --global alias.unstage 'reset HEAD' 那么git reset HEAD filename=git unstage filename
  • git config --global alias.last 'log -1'git last就显示最后一次提交了。

5、搭建Git服务器

  1. sudo apt-get install git 安装Git;
  2. sudo adduser git 添加Git用户;
  3. sudo git init --bare sample.git 初始化git仓库;
  4. sudo chown -R git:git sample.git修改仓库的所属用户为git;
  5. 将git用户的信息git:x:1001:1001:,,,:/home/git:/bin/bash改成git:x:1001:1001:,,,:/home/git:/bin/git-shell,为了禁用shell登录。
  6. git clone git@server:/director/sample.git 克隆Git服务器上的仓库

PS. 想方便管理公钥,用Gitosis;想控制权限,用Gitolite

对前一段时间学习Linux做一个总结,主要是整理笔记,写的可能比较乱,但是内容比较丰富,还是值得一看的。内容总共分为:用户账户、进程管理、计划任务、文件系统构成、磁盘管理、备份、Shell编程。内容都是比较基础,比较常用的,过一遍会加深你的印象。

1. 用户账户

Linux用户基本上分为下面三类:超级用户(root , UID=0)、普通用户(UID=[500,60000])、伪用户(UID=[1,499])。

用户配置文件储存在/etc/passwd文件下,文件中每一行代表一个用户,每一列代表用户的基本信息,第一列代表用户的用户名,第二列代表用户的密码,密码使用*代替。因为密码是通过加密后存储在/etc/shadow文件下了,这个文件的权限只有root用户才能访问。

pwunconv命令可以将密码回写到/etc/passwd文件中,执行了这个密码后,再次进入/etc/passwd文件中,就会发现第二列的*被一串字符串所替代,这就是加密后的密码。pwconv命令正好与上面的命令意思相反,它将密码从passwd中写入到shadow中,这个命令一般是在我们创建用户后就会自动执行。

  • 用户组文件:/etc/group
  • 用户组密码文件:/etc/gshadow
  • 用户配置文件:/etc/login.defs/etc/default/useradd
  • 新用户信息文件:/etc/skel,在创建新用户后,会自动将此文件夹中的内容拷贝到新用户的HOME目录下,作为新用户的配置文件;

登录显示信息:/etc/motd成功后、/etc/issue登录时。

1.1 普通用户为什么可以改密码?

上面说过密码存放在/etc/passwd以及/etc/shadow中,而这两个文件对其他用户均没有写权限。
普通用户用passwd命令改密码,该命令的全路径是/usr/bin/passwd,你可以通过ls -l /usr/bin/passwd查看到该命令的权限,为-rwsr-xr-x,可以看到有个s权限位。
这个s权限位的意思就是当其他用户在使用这个命令的时候,将暂时获得这个命令的所属用户的权限。换句话就是说当普通用户在使用passwd命令的时候,会暂时获取root权限,从而可以改变/etc/passwd里的密码值,达到改密码的效果。

1.2 特殊权限位

那么,像上面那样的特殊权限位有哪些呢?又如何设置呢?

  • setUID:就是上面的s权限位,可以通过以下命令进行设置
    • chmod u+s filename
    • chmod 4755 filename
  • setGID: 大概意思同setUID,就是执行行默认获取命令所属组的权限,同样,可以通过下面命令进行设置
    • chmod g+s filename
    • chmod 2755 filename
  • 粘着位:用t表示,你可以通过查看/tmp目录的权限就知道了,那么,它的作用是什么呢?

/tmp目录的权限代表什么意思?粘着位只是针对目录进行设置,大家知道/tmp目录的权限为drwxrwxrwt,意思就是什么人都具有读、写、执行的权限,那么,如果我建的文件或者目录被别人删了怎么办?所以,粘着位的作用就是:每个人在目录里都有读、写、执行的权限,但是只有自己可以删除自己创建的文件。

很神奇是不是?来看看怎么设置?两种方式,chmod o+t dir&chmod 1777 dir,dir代表目录。

1.3 添加用户

useradd -D 其实就是根据/etc/default/useradd默认配置来创建的
default

1.4 用户组管理命令

  • usermod -G 组名 用户名 将用户加入用户组
  • gpasswd -a 用户名 组名 将用户加入用户组
  • groups查看用户隶属那些用户组
  • newgrp 切换用户组
  • grpck 用户组配置文件检查
  • chgrp修改文件所属用户组
  • vigr 编辑/etc/group文件

1.5 用户管理命令

  • pwck 检测/etc/passwd文件
  • vipw 编辑/etc/passwd文件
  • id 查看用户详细信息
  • finger 查看用户详细信息,有些Linux发行版默认不带此命令
  • passwd -S 查看用户密码状态
  • who or w查看当前登录用户信息

1.6 实例

  • 添加用户组:groupadd -g 888 webadmin
  • 删除用户组:groupdel webadmin
  • 修改用户信息:groupmod -n apache webadmin(将webadmin组名修改为apache)
  • 检测用户:passwd -S username
  • 锁定用户:passwd -l username

1.7 sudo

使普通用户以root的方式执行命令。

  • 配置文件/etc/sudoers
  • 格式:用户名(组名) 主体地址=命令(绝对路径);
  • 实例:sudoer文件中有编写规则说明,具体参照下图。

sudoer

2. 进程管理

进程管理不得不介绍的四个命令,pskillnice/renicetop

2.1 PS

查看进程的命令,非常强大哦。它有三种表达方式,具体可以参照man文档的description部分。
ps_des

  • a 显示所有的用户
  • u 显示用户名和启动时间
  • x 显示没有控制终端进程
  • -e 显示所有进程
  • -f 显示完整格式

常用命令

  • ps aux or ps -ef都是显示所有用户进程,只是不一样的表达方式
  • ps -uU username查看系统中指定用户执行的进程

很有必要看一下ps命令的man说明文档,下面图片贴出文档中example部分内容。
ps_example

2.2 Kill

这个命令也很常用的,杀死进程.

  • kill PID根据进程号,直接终止进程
  • kill -9 PID强行关闭
  • kill -1 PID重启进程
  • xkill关闭图形程序
  • killall 进程名结束该进程

2.3 nice/renice

改变进程的优先级,每一个进程都有一个优先级(也称nice值),其范围为[-20,19],最高到最低,注意-20是最高的哦,默认情况下,进程的优先级都是0,优先级高的进程会比较频繁的被调用运行。

nice设定进程的优先级。格式:nice -n command,eg. nice -n 19 dd if=/dev/cdrom of=~/mdk.iso利用最低优先级创建一张cd的镜像,防止复制操作阻碍其他进程。

renice更改用户的优先级。格式:renice -n pid , eg. renice -5 777提高777进程的优先级。

2.4 top

知道Windows下的任务管理器吧,这个命令就是命令行下的任务管理器。
top

很强大的命令,介绍下简要用法。

  • d:指定刷新间隔
  • c:显示整个命令行
  • u:查看指定用户进程
  • k:终止执行进程
  • h:帮助

3. 计划任务

计划任务最常用的两个命令就是atcrontabat命令是一次性执行任务;crontab是周期性运行作业。

3.1 at

格式:at [-f filename] time,这里的time也就是时间分为两类:

  • 绝对计时
    • hh:mm MM/DD/YY
  • 相对计时
    • now + n minutes
    • now + n hours
    • now + n days

实例

  • at 5:30pm
  • at now + 18minutes
  • at 17:30 1/11/11

接下来输入命令,输入完后ctrl+D保存任务。注意:命令一定要是绝对路径。

  • at -l列举任务
  • at -d删除任务

配置文件

  • /etc/at.allow允许用户列表
  • /etc/at.deny不允许用户列表

3.2 crontab

作用:用于生成cron进程所需要的crontab文件;
格式:crontab {-l|-r|-e}

  • -l显示当前的crontab
  • -r删除
  • -e编辑

编辑规则,将知道的具体时间填上,不知道的填*

1
2
3
4
分钟 | 小时 | 天 | 月 | 星期 | 命令/脚本 |
30 | 17 | \* | \* | 1-5 | /usr/bin/wall < x.txt |
45 | 17 | \* | \* | 1-5 | /sbin/shutdown -r now |
\*/2 | 12-14 | \* | 3-6,9-12 | 1-5 | 检测脚本 |

上面第一例,每个周一到周五的17:30进行广播操作;第二例,每周一到周五17:45进行重启操作;第三例,3-6月和9-12月,每周一到周五,每隔2分钟进行脚本检测。

4. 文件系统构成

  • /usr/bin & /bin 可执行的命令
  • /usr/sbin & /sbin root可执行的的命令
  • /proc 虚拟文件系统,存放当前内容镜像
  • /dev 存放设备文件
  • /lib 存放系统程序运行所需的共享库
  • /lost+found 存放一些系统出错的检查结果
  • /tmp 临时文件
  • /etc 系统配置文件
  • /var 存放经常发生变动的文件,比如邮件、日志等
  • /usr 存放所有的命令、库、手册页等
  • /mnt 临时文件系统的安装点
  • /boot 内核文件及自带程序文件保存位置
  • /usr/local 安装第三方软件默认路劲

5. 磁盘管理

关于dudf之类的命令这里就不介绍了,这里主要介绍的是如何添加磁盘和分区、如何添加swap分区以及磁盘配额的内容。

5.1 添加磁盘或分区

总共分为4大步。

  1. fdisk,划分分区。
    • fdisk -l /dev/sdb,查看磁盘分区情况
    • fdisk /dev/sdb,对磁盘进行操作,见下面基本操作
      • m 帮助
      • p 打印分区表
      • n 增加新的分区
      • t 改变分区文件系统ID
      • L 查看文件系统ID
      • d 删除分区
      • w 保存分区表
      • q 退出(不保存)
  2. mkfs,创建文件系统。
    • mkfs.ext3 /dev/sdb 将分区格式化为ext3文件系统类型
  3. mount,挂载分区。
    • mount /dev/sdb /mnt 将sdb分区挂载到mnt目录下
  4. df -h 查看系统磁盘,可以看到mnt分区,注意:我这是在虚拟机中测试的
    fdisk_sdb
  5. 写入配置文件,编辑/etc/fstab。文件的内容信息格式如下;
1
2
3
4
物理分区名 | 挂载点 | 文件系统 | 缺省设置 | 是否检测(1:检测;2:检测)| 检测顺序(0:是否检测;1:优先检测;2:期后检测)
LABEL=1 | / | ext3 | default | 1 | 2
/dev/sda1 | / | ext3 | default | 0 | 0
/dev/sdb1 | /web | ext3 | default | 1 | 1
  • e2label /dev/sdb1 检测是否有卷标
  • e2label /dev/sdb1 name添加卷标

5.2 添加Swap分区

两种方法扩大swap分区

  • 新建磁盘,分swap分区
  • 在已有磁盘上使用swapfile文件增大swap分区

第一种方法可以根据上面增加分区的步骤一样进行操作,这里主要记录一下使用swapfile文件增大swap分区的步骤。

  1. mkdir /var/swap 新建swap目录
  2. chmod 700 /var/swap 设置目录权限
  3. dd if=/dev/zero of=/var/swap/file.swp bs=1024 count=3000 创建swp文件,大小为3MB
  4. mkswap /var/swap/file.swp 使文件可用
  5. vim /etc/fstab 写入配置文件
  6. free 查看分区
  7. swapon /var/swap/file.swp 启用swap分区
  8. free 再次查看分区,如图显示,之前和之后的swap分区大小。

swap

5.3 磁盘配额(针对分区)

磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。可分为三类限制:

  • 软限制(Soft limit):定义用户可以占用的磁盘空间数。当用户超过该限制后会收到已超过配额的警告。
  • 硬限制(Hard limit):当用户试图将文件存放在其已经超过该限制目录时,报告文件系统错误。
  • 宽限制(Grace period):定义用户在软限制下可以使用其文件系统的期限。

操作步骤

  1. 开启分区配额功能,vim /etc/fstab,编辑配置文件,在挂载属性上加上标志userquota或grpquota,然后重新挂载mount -o remount /home,或重新启动系统sudo init 6
  2. 建立配额数据库,quotacheck -Cvuga,会生成aquota.user、aquota.group两文件。
  3. 启动配额功能,quotaon 分区名称;关闭配额功能,quotaoff 分区名称
  4. 编辑配额
    • edquota username 编辑用户配额
    • edquota -g groupname 编辑用户组配额
    • edquota -t 设置宽期限 设置宽期限
    • edquota -p 模版用户 复制用户1 复制用户2
    • quota username 查看用户的配额使用情况
    • repquota -a 管理员查看配额信息

6. 备份

备份几乎是Linux系统运维最频繁的工作了,不过大部分情况下,都是通过自动化脚本进行备份。

6.1 备份策略

  • 完全备份
  • 增量备份:通常是这种情况

6.2 备份分类

  • 系统备份:/etc , /boot , /usr/local , /var , /log
  • 用户备份:/home

6.3 备份相关命令

其实主要就是通过cptar命令

  • cp -Rpu 复制文件
    • -p 保持文件原本属性
    • -u 增量备份
    • -R 循环复制
  • scp 远程备份,类似cp命令
  • tar -zcf /backup/sys.tar.gz /etc /boot 备份/etc , /boot
  • tar -ztf /backup/sys.tar.gz 查看备份包中的文件(不解包)
  • tar -zxf /backup/sys.tar.gz 还原备份目录,其实就是解包
  • tar -zxf /backup/sys.tar.gz -C ./backup 解压到指定目录backup
  • tar -zxf /backup/sys.tar.gz etc/group 恢复指定文件
  • tar -rf /backup/sys.tar /etc/file1 /etc/file2 追加文件到备份包中
  • tar -uf /backup/sys.tar /etc/file 将修改过的文件做备份

7. Shell脚本编程实例

下面的例子基本上都是上面的知识点,比较扩展一点的就是awk命令的用法,下面代码__仅作参考__,写的不好,请见谅;错误的地方烦请指出,不胜感激!

7.1 测试Apache服务是否启动,若没有启动,则启动Apache服务

1
2
3
4
5
6
7
#! /bin/sh
# 测试Apache服务是否启动,若没有启动,则启动Apache服务
web=`/usr/bin/pgrep httpd`
if [ "ABC$web" = "ABC" ]
then
/etc/init.d/httpd start
fi

7.2 判断某个文件属于什么类型的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /bin/sh
# 判断一个文件属于什么类型
f [ -d $1 ]
then
echo "这是一个目录";
elif [ -f $1 ]
then
echo "这是个普通文件"
elif [ -c $1 ]
then
echo "这是字符特殊文件"
elif [ -b $1 ]
then
echo "这是块特殊文件"
else
echo "我也不知道这是啥玩意"
fi

7.3 踢出用户的脚本

1
2
3
4
5
6
7
8
9
10
11
12
#! /bin/sh
# 判断用户是否在线,存在的话踢出用户
username=$1
/usr/bin/w > whoIsOnline
userString=`/usr/bin/awk -v user=$username '{if($1 == user) print $1}' ./whoIsOnline`
if [ "ABC$userString" = "ABC" ]
then
echo "$1 is not online"
else
killId=`/usr/bin/ps aux | /usr/bin/grep $username | /usr/bin/eprep -v grep |/usr/bin/awk {print $2}`
kill $killId
fi

7.4 显示用户的信息

1
2
3
4
5
6
7
8
9
#! /bin/sh
# 显示用户的相关信息
user=$1
if [ "ABC$user" = "ABC" ]
then
echo "请在命令行后面输入要查询的用户名!"
else
/usr/bin/grep ^$1: /etc/passwd | /usr/bin/awk -F ":" '{print "用户ID为"$3 ; print"用户组ID为"$4 ; print "你其实是"$5 ; print "你的主目录为"$6 ; print"你的默认Shell为"$7}'
fi

7.5 加减乘除的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#! /bin/sh
# 加减乘除的小脚本,主要练习case语句
case $2 in
+)
echo "$1 + $3 = `expr $1 + $3` "
;;
-)
echo "$1 - $3 = `expr $1 - $3`"
;;
\*)
echo "$1 * $3 = `expr $1 \* $3`"
;;
/)
if [ $3 = 0 ]
then
echo "除数不能为0"
exit
else
echo "$1 / $3 = `expr $1 / $3`"
fi
;;
*)
echo "您的输入不符合规范,请重新输入"
esac

7.6 打印出1到10之间的平方数

1
2
3
4
5
6
7
8
9
#! /bin/sh
# 打印1-10之间的平方数,主要练习while语句
#赋值的时候注意不要加空格
i=1
while [ $i -le 10 ]
do
echo "$i 的平方为:`expr $i \* $i`"
i=`expr $i + 1`
done
1
2
3
4
5
6
#! /bin/sh
# 打印1-10之间的平方数,主要练习for语句
for i in {1..10}
do
echo "$i 的平方为:`expr $i \* $i`"
done

7.7 累加求和(使用shift命令)

1
2
3
4
5
6
7
8
9
#! /bin/sh
# 使用shift命令累加求和
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
done
echo "总和为:$sum"