第十一章 进程
Ps |
报告当前进程快照 |
Top |
显示任务 |
Jobs |
列出活跃的任务 |
Bg |
把一个任务放到后台执行 |
Fg |
把一个任务放到前台执行 |
Kill |
给一个进程发送信号 |
Killall |
杀死指定名字的进程 |
Shutdown |
关机或重启系统 |
当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程序。
init 再依次运行一系列 叫做init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。
其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户界面。 这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。
init的PID总是1。剩下的进程升序排列。
PS
只使用ps命令本身的话只会返回和当前终端相关的进程。
TTY代表teletype,指进程的终端。
[me@linuxbox ~]$ ps
PID TTY TIME CMD
5198 pts/1 00:00:00 bash
10129 pts/1 00:00:00 ps
在后面加上x可以返回更多的进程。会返回很多很多结果。
STAT代表进程的状态。
状态 |
含义 |
R |
运行中。这意味着,进程正在运行或准备运行。 |
S |
正在睡眠。进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络分组。 |
D |
不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
T |
已停止. 已经指示进程停止运行。稍后介绍更多。 |
Z |
一个死进程或“僵尸”进程。这是一个已经终止的子进程,但是它的父进程还没有清空它。 (父进程没有把子进程从进程表中删除) |
< |
一个高优先级进程。这可能会授予一个进程更多重要的资源,给它更多的 CPU 时间。 进程的这种属性叫做 niceness。具有高优先级的进程据说是不好的(less nice), 因为它占用了比较多的 CPU 时间,这样就给其它进程留下很少时间。 |
N |
低优先级进程。 一个低优先级进程(一个“好”进程)只有当其它高优先级进程被服务了之后,才会得到处理器时间。 |
大写字母之后的其他字符代表各种外来进程的特性。
另外一个流行(真的很流行)的组合是aux。输出BSD(Berkeley Software Distribution)风格的结果。
标题 |
含义 |
USER |
用户 ID. 进程的所有者。 |
%CPU |
以百分比表示的 CPU 使用率 |
%MEM |
以百分比表示的内存使用率 |
VSZ |
虚拟内存大小 |
RSS |
进程占用的物理内存的大小,以千字节为单位。 |
START |
进程启动的时间。若它的值超过24小时,则用天表示。 |
top
top命令类似windwos的“任务管理器”,输出的结果三秒刷新一次。
输出结果中上面是系统概要,下面是进程列表,以CPU占用率排序。
~实例说明系统概要:
行号 |
字段 |
意义 |
1 |
top |
程序名。 |
|
14:59:20 |
当前时间。 |
|
up 6:30 |
这是正常运行时间。它是计算机从上次启动到现在所运行的时间。 在这个例子里,系统已经运行了六个半小时。 |
|
2 users |
有两个用户登录系统。 |
|
load average: |
加载平均值是指,等待运行的进程数目,也就是说,处于可以运行状态并共享 CPU 的进程个数。 这里展示了三个数值,每个数值对应不同的时间段。第一个是最后60秒的平均值, 下一个是前5分钟的平均值,最后一个是前15分钟的平均值。若平均值低于1.0,则指示计算机 工作不忙碌。 |
2 |
Tasks: |
总结了进程数目和这些进程的各种状态。 |
3 |
Cpu(s): |
这一行描述了 CPU 正在进行的活动的特性。 |
|
0.7%us |
0.7% 的 CPU 被用于用户进程。这意味着进程在内核之外。 |
|
1.0%sy |
1.0%的 CPU 时间被用于系统(内核)进程。 |
|
0.0%ni |
0.0%的 CPU 时间被用于"nice"(低优先级)进程。 |
|
98.3%id |
98.3%的 CPU 时间是空闲的。 |
|
0.0%wa |
0.0%的 CPU 时间来等待 I/O。 |
4 |
Mem: |
展示物理内存的使用情况。 |
5 |
Swap: |
展示交换分区(虚拟内存)的使用情况。 |
Top接受键盘指令。直接按h显示帮助,直接按q退出top。
控制进程
输入xlogo,获取一个示例程序。
中断进程
首先xlogo一下,此时linux命令行没有返回;按下Ctrl-c,中断。
后台执行
输入xlogo &
会返回任务号和PID。并且可以输入下一条指令了。
此时可以在ps里看到xlogo。
通过命令jobs可以看到任务。
返回前台
使用fg %【任务序号】
~
[me@linuxbox ~]$ fg %1
xlogo
停止(而非终止)一个进程
输入xlogo,之后ctrl-z
之后你调整xlogo窗口的大小,会发现X不动了。
使用fg可以让它复活
使用bg再次把它移到后台
Signals
首先启动xlogo &
此时打印出了PID和jobspec
使用kill 【PID】
或者
kill %【jobspec】终止。
kill并不能是用来“杀死”程序,而是给它发送信号。例如ctrl-c其实是发送INT(中断)的信号,ctrl-z其实是发送TSTP(终端停止)的信号。
KILL真正的语法形式:
kill [-signal] PID...
如果没有填入可选项,那么默认是TERM(终止)。
编号 |
名字 |
含义 |
1 |
HUP |
挂起。这是美好往昔的残留部分,那时候终端机通过电话线和调制解调器连接到 远端的计算机。这个信号被用来告诉程序,控制的终端机已经“挂起”。 通过关闭一个终端会话,可以展示这个信号的作用。在当前终端运行的前台程序将会收到这个信号并终止。 许多守护进程也使用这个信号,来重新初始化。这意味着,当一个守护进程收到这个信号后, 这个进程会重新启动,并且重新读取它的配置文件。Apache 网络服务器守护进程就是一个例子。 |
2 |
INT |
中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
9 |
KILL |
杀死。这个信号很特别。尽管程序可能会选择不同的方式来处理发送给它的 信号,其中也包含忽略信号,但是 KILL 信号从不被发送到目标程序。而是内核立即终止 这个进程。当一个进程以这种方式终止的时候,它没有机会去做些“清理”工作,或者是保存工作。 因为这个原因,把 KILL 信号看作最后一招,当其它终止信号失败后,再使用它。 |
15 |
TERM |
终止。这是 kill 命令发送的默认信号。如果程序仍然“活着”,可以接受信号,那么 这个它会终止。 |
18 |
CONT |
继续。在一个停止信号后,这个信号会恢复进程的运行。 |
19 |
STOP |
停止。这个信号导致进程停止运行,而不是终止。像 KILL 信号,它不被 发送到目标进程,因此它不能被忽略。 |
其他常用信号
编号 |
名字 |
含义 |
3 |
QUIT |
退出 |
11 |
SEGV |
段错误。如果一个程序非法使用内存,就会发送这个信号。也就是说, 程序试图写入内存,而这个内存空间是不允许此程序写入的。 |
20 |
TSTP |
终端停止。当按下 Ctrl-z 组合键后,终端发送这个信号。不像 STOP 信号, TSTP 信号由目标进程接收,且可能被忽略。 |
28 |
WINCH |
改变窗口大小。当改变窗口大小时,系统会发送这个信号。 一些程序,像 top 和 less 程序会响应这个信号,按照新窗口的尺寸,刷新显示的内容。 |
KILALL
基本格式
killall [-u user] [-signal] name...
一看就懂的实例
[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated xlogo
[2]+ Terminated xlogo
其他进程相关指令
命令名 |
命令描述 |
pstree |
输出一个树型结构的进程列表,这个列表展示了进程间父/子关系。 |
vmstat |
输出一个系统资源使用快照,包括内存,交换分区和磁盘 I/O。 为了看到连续的显示结果,则在命令名后加上更新操作延时的时间(以秒为单位)。例如,“vmstat 5”。 ,按下 Ctrl-c 组合键, 终止输出。 |
xload |
一个图形界面程序,可以画出系统负载随时间变化的图形。 |
tload |
与 xload 程序相似,但是在终端中画出图形。使用 Ctrl-c,来终止输出。 |
第十二章 shell环境
Printenv |
打印部分或所有的环境变量 |
Set |
设置 shell 选项 |
Export |
导出环境变量,让随后执行的程序知道。 |
Alias |
创建命令别名 |
shell 在环境中存储了两种基本类型的数据,环境变量和 shell 变量。
shell 变量是 bash 存放的少量数据,剩下的都是 环境变量。
除此之外,还存储了一些shell函数。
printenv打印所有环境变量
会返回很长的结果。
[me@linuxbox ~]$ printenv USER
Me
使用alias来查看别名。
[me@linuxbox ~]$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
这是为什么ls会带颜色。
环境变量列表
DISPLAY |
如果你正在运行图形界面环境,那么这个变量就是你显示器的名字。通常,它是 ":0", 意思是由 X 产生的第一个显示器。 |
EDITOR |
文本编辑器的名字。 |
SHELL |
shell 程序的名字。 |
HOME |
用户家目录。 |
LANG |
定义了字符集以及语言编码方式。 |
OLD_PWD |
先前的工作目录。 |
PAGER |
页输出程序的名字。这经常设置为/usr/bin/less。 |
PATH |
由冒号分开的目录列表,当你输入可执行程序名后,会搜索这个目录列表。 |
PS1 |
Prompt String 1. 这个定义了你的 shell 提示符的内容。随后我们可以看到,这个变量 内容可以全面地定制。 |
PWD |
当前工作目录。 |
TERM |
终端类型名。类 Unix 的系统支持许多终端协议;这个变量设置你的终端仿真器所用的协议。 |
TZ |
指定你所在的时区。大多数类 Unix 的系统按照协调时间时 (UTC) 来维护计算机内部的时钟 ,然后应用一个由这个变量指定的偏差来显示本地时间。 |
USER |
你的用户名 |
如何建立shell环境
当我们登录系统后, bash 程序启动,并且会读取一系列称为启动文件的配置脚本, 这些文件定义了默认的可供所有用户共享的 shell 环境。
然后是读取更多位于我们自己家目录中 的启动文件,这些启动文件定义了用户个人的 shell 环境。
有两种 shell 会话类型:一个是登录 shell 会话,另一个是非登录 shell 会话。
登录shell会话会提示输入用户名和密码,非shell会话通常是用GUI启动。
登录shell会话启动的文件
/etc/profile |
应用于所有用户的全局配置脚本。 |
~/.bash_profile |
用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。 |
~/.bash_login |
如果文件 ~/.bash_profile 没有找到,bash 会尝试读取这个脚本。 |
~/.profile |
如果文件 ~/.bash_profile 或文件 ~/.bash_login 都没有找到,bash 会试图读取这个文件。 这是基于 Debian 发行版的默认设置,比方说 Ubuntu。 |
非shell会话
/etc/bash.bashrc |
应用于所有用户的全局配置文件。 |
~/.bashrc |
用户个人的启动文件。可以用来扩展或重写全局配置脚本中的设置。 |
看一下.bash_profile文件的内容:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
#export PATH让这个shell的子进程也可以使用PATH变量的内容
文本编辑器
Nano
保存:ctrl-o
例如我们可以修改.bashrc,在最后加上这么几行:
umask 0002
export HISTCONTROL=ignoredups
export HISTSIZE=1000
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
它们的意思是:
文本行 |
含义 |
umask 0002 |
设置掩码来解决共享目录的问题。 |
export HISTCONTROL=ignoredups |
使得 shell 的历史记录功能忽略一个命令,如果相同的命令已被记录。 |
export HISTSIZE=1000 |
增加命令历史的大小,从默认的 500 行扩大到 1000 行。 |
alias l.='ls -d .* --color=auto' |
创建一个新命令,叫做'l.',这个命令会显示所有以点开头的目录项。 |
alias ll='ls -l --color=auto' |
创建一个叫做'll'的命令,这个命令会显示长格式目录列表。 |
.bashrc文件只会在刚启动终端会话时读取。为了使我们刚才的操作生效,需要使用source强迫bash重新读取刚才的文件
source .bashrc
第十三章 vi简介
vi读作vee-eye,来源于visual。
一般来说,vi就是vim。(improved),但是有时一些老系统会运行在vim的兼容模式下,就很烦。这时你需要
echo “set nocp” >> ~/.vimrc
创建新文件: 直接
[me@linuxbox ~]$ vi foo.txt
每行开头的波浪线代表那一行没有文本。
默认我们处于命令模式。按下i或者insert进入插入模式。
插入模式下可以使用:w或者:q来保存或退出。
又是令人恶心的大表了:
按键 |
移动光标 |
l or 右箭头 |
向右移动一个字符 |
h or 左箭头 |
向左移动一个字符 |
j or 下箭头 |
向下移动一行 |
k or 上箭头 |
向上移动一行 |
0 (零按键) |
移动到当前行的行首。 |
^ |
移动到当前行的第一个非空字符。 |
$ |
移动到当前行的末尾。 |
w |
移动到下一个单词或标点符号的开头。 |
W |
移动到下一个单词的开头,忽略标点符号。 |
b |
移动到上一个单词或标点符号的开头。 |
B |
移动到上一个单词的开头,忽略标点符号。 |
Ctrl-f or Page Down |
向下翻一页 |
Ctrl-b or Page Up |
向上翻一页 |
numberG |
移动到第 number 行。例如,1G 移动到文件的第一行。 |
G |
移动到文件末尾。 |
类似G,很多命令都可以在前面加数字。例如5j表示向下移动5行。
在命令模式下,按下大写A在行尾(本行)添加文本。(等于i+$)
撤销:直接按u
大写A:在当前行尾insert
删除命令:
命令 |
删除的文本 |
x |
当前字符 |
3x |
当前字符及其后的两个字符。 |
dd |
当前行。 |
5dd |
当前行及随后的四行文本。 |
复制:
命令 |
复制的内容 |
yy |
当前行。 |
5yy |
当前行及随后的四行文本。 |
y$ |
从当前光标位置到当前行的末尾。 |
yG |
从当前行到文件末尾。 |
$和G的使用,对删除命令同样有效。
粘贴时,p粘贴到下一行,大写P粘贴到上一行。
由于vi不能直接删除行尾的换行符来链接两行,所以vi提供了大写 J 来连接本行和下一行。
替换文本
:%s/Line/line/g
看起来很难,其实很简单,实际上,只要知道%的意思是匹配全部文本,s是指定替换操作,g是指定每行的每个匹配项,就都知道了。
条目 |
含义 |
: |
冒号字符运行一个 ex 命令。 |
% |
指定要操作的行数。% 是一个快捷方式,表示从第一行到最后一行。另外,操作范围也 可以用 1,5 来代替(因为我们的文件只有5行文本),或者用 1,$ 来代替,意思是 “ 从第一行到文件的最后一行。” 如果省略了文本行的范围,那么操作只对当前行生效。 |
s |
指定操作。在这种情况下是,替换(查找与替代)。 |
/Line/line |
查找类型与替代文本。 |
g |
这是“全局”的意思,意味着对文本行中所有匹配的字符串执行查找和替换操作。如果省略 g,则 只替换每个文本行中第一个匹配的字符串。 |
在g后加c,将在每次替换是询问是否真的要替换。
在文件之间切换:
:n |
下一个文件 |
:N |
上一个文件 |
或者,使用:buffers 展示所有文件
找到对应文件的编号。使用:buffers 3 跳到第三号文件。
我们知道可以用e来附加打开文件。此时无法使用:n来切换,只能使用buffers。
将整个文件插入(拷贝)到另一个文件中:
打开一个文件,输入:r +文件名。
第十四章 自定制 shell 提示符
[me@linuxbox ~]$
这个东西就是shell提示符。它是由环境变量$PS1决定的。(是“prompt string one” 的简写)
echo可以看到其内容:
[me@linuxbox ~]$ echo $PS1
[\u@\h \W]\$
序列 |
显示值 |
\a |
以 ASCII 格式编码的铃声 . 当遇到这个转义序列时,计算机会发出嗡嗡的响声。 |
\d |
以日,月,天格式来表示当前日期。例如,“Mon May 26.” |
\h |
本地机的主机名,但不带末尾的域名。 |
\H |
完整的主机名。 |
\j |
运行在当前 shell 会话中的工作数。 |
\l |
当前终端设备名。 |
\n |
一个换行符。 |
\r |
一个回车符。 |
\s |
shell 程序名。 |
\t |
以24小时制,hours:minutes:seconds 的格式表示当前时间. |
\T |
以12小时制表示当前时间。 |
\@ |
以12小时制,AM/PM 格式来表示当前时间。 |
\A |
以24小时制,hours:minutes 格式表示当前时间。 |
\u |
当前用户名。 |
\v |
shell 程序的版本号。 |
\V |
Version and release numbers of the shell. |
\w |
当前工作目录名。 |
\W |
当前工作目录名的最后部分。 |
\! |
当前命令的历史号。 |
\# |
当前 shell 会话中的命令数。 |
\$ |
这会显示一个"$"字符,除非你拥有超级用户权限。在那种情况下, 它会显示一个"#"字符。 |
\[ |
标志着一系列一个或多个非打印字符的开始。这被用来嵌入非打印 的控制字符,这些字符以某种方式来操作终端仿真器,比方说移动光标或者是更改文本颜色。 |
\] |
标志着非打印字符序列结束。 |
知道了这个表,就可以随便干你想干的事情了:
~
$ PS1="\A \h \$ "
17:33 linuxbox $
也可以改变其颜色:
Sequence |
Text Color |
Sequence |
Text Color |
\033[0;30m |
Black |
\033[1;30m |
Dark Gray |
\033[0;31m |
Red |
\033[1;31m |
Light Red |
\033[0;32m |
Green |
\033[1;32m |
Light Green |
\033[0;33m |
Brown |
\033[1;33m |
Yellow |
\033[0;34m |
Blue |
\033[1;34m |
Light Blue |
\033[0;35m |
Purple |
\033[1;35m |
Light Purple |
\033[0;36m |
Cyan |
\033[1;36m |
Light Cyan |
\033[0;37m |
Light Gray |
\033[1;37m |
White |
怎么使用这些鬼画符呢?只需要将它们用 [] 标记出来就好了。注意方括号要加转义,最后结果是包含2个左方括号和一个右方括号。
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$'
<me@linuxbox ~>$
这样,命令也会是红色的。使用以下命令将我们输入的命令改回黑色:
<me@linuxbox ~>$ PS1='\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]'
设置背景颜色:
\033[0;40m |
蓝色 |
\033[1;44m |
黑色 |
\033[0;41m |
红色 |
\033[1;45m |
紫色 |
\033[0;42m |
绿色 |
\033[1;46m |
青色 |
\033[0;43m |
棕色 |
\033[1;47m |
浅灰色 |
剩下的移动光标实在是没用。不看了。
第十五章 软件包管理
主要的包管理系统家族
包管理系统 |
发行版 (部分列表) |
Debian Style (.deb) |
Debian, Ubuntu, Xandros, Linspire |
Red Hat Style (.rpm) |
Fedora, CentOS, Red Hat Enterprise Linux, OpenSUSE, Mandriva, PCLinuxOS |
linux的大多数软件由发行商以包文件的形式提供,剩下的则以源码形式存在,可以手动安装。
在包管理系统中软件的基本单元是包文件。
包文件是一个构成软件包的文件压缩集合。
一个软件包可能由大量程序以及支持这些程序的数据文件组成。
依赖:
程序很少独立工作;他们需要依靠其他程序的组件来完成他们的工作。程序所共有的活动,如输入/输出, 就是由一个被多个程序调用的子例程处理的。
这些子例程存储在动态链接库中。动态链接库为多个程 序提供基本服务。
如果一个软件包需要一些共享的资源,如一个动态链接库,它就被称作有一个依赖。
现代的软件包管理系统都提供了一些依赖项解析方法,以确保安装软件包时,其所有的依赖也被安装。
#【动态链接】提供了一种方法,使进程可以调用不属于其可执行代码的函数。
windows下是.dll文件,linux下是.so文件。
分为底层和上层工具:我理解就是底层用来执行下载的包,上层就是直接安装。
发行版 |
底层工具 |
上层工具 |
Debian-Style |
dpkg |
apt-get, aptitude |
Fedora, Red Hat Enterprise Linux, CentOS |
rpm |
yum |
查找:
风格 |
命令 |
Debian |
apt-get update; apt-cache search search_string |
Red Hat |
yum search search_string |
安装:
风格 |
命令 |
Debian |
apt-get update; apt-get install package_name |
Red Hat |
yum install package_name |
直接通过底层工具安装的话,就是没有通过依赖解析直接安装。
Style |
Command(s) |
Debian |
dpkg --install package_file |
Red Hat |
rpm -i package_file |
若发现依赖不存在,会报错退出。
删除
风格 |
命令 |
Debian |
apt-get remove package_name |
Red Hat |
yum erase package_name |
更新:
风格 |
命令 |
Debian |
apt-get update; apt-get upgrade |
Red Hat |
yum update |
底层软件包升级
风格 |
命令 |
Debian |
dpkg --install package_file |
Red Hat |
rpm -U package_file |
列出所有软件包
风格 |
命令 |
Debian |
dpkg --list |
Red Hat |
rpm -qa |
查看是否已经安装了:
风格 |
命令 |
Debian |
dpkg --status package_name |
Red Hat |
rpm -q package_name |
查看哪个软件包应该为某个文件负责:
风格 |
命令 |
Debian |
dpkg --search file_name |
Red Hat |
rpm -qf file_name |
第十六章 存储媒介
使用vim /etc/fstab 就可以看到启动时会挂在的设备(硬盘分区)。
其内容类似:
LABEL=/12 / ext3 defaults 1 1
LABEL=/home /home ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2
字段 |
内容 |
说明 |
1 |
设备名 |
传统上,这个字段包含与物理设备相关联的设备文件的实际名字,比如说/dev/hda1(第一个 IDE 通道上第一个主设备分区)。然而今天的计算机,有很多热插拔设备(像 USB 驱动设备),许多 现代的 Linux 发行版用一个文本标签和设备相关联。当这个设备连接到系统中时, 这个标签(当储存媒介格式化时,这个标签会被添加到存储媒介中)会被操作系统读取。 那样的话,不管赋给实际物理设备哪个设备文件,这个设备仍然能被系统正确地识别。 |
2 |
挂载点 |
设备所连接到的文件系统树的目录。 |
3 |
文件系统类型 |
Linux 允许挂载许多文件系统类型。大多数本地的 Linux 文件系统是 ext3, 但是也支持很多其它的,比方说 FAT16 (msdos), FAT32 (vfat),NTFS (ntfs),CD-ROM (iso9660),等等。 |
4 |
选项 |
文件系统可以通过各种各样的选项来挂载。有可能,例如,挂载只读的文件系统, 或者挂载阻止执行任何程序的文件系统(一个有用的安全特性,避免删除媒介。) |
5 |
频率 |
一位数字,指定是否和在什么时间用 dump 命令来备份一个文件系统。 |
6 |
次序 |
一位数字,指定 fsck 命令按照什么次序来检查文件系统。 |
Mount
mount命令被用来挂载文件系统。执行这个不带参数的命令,将会显示 一系列当前挂载的文件系统。
[me@linuxbox ~]$ mount
/dev/sda2 on / type ext3 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/sda5 on /home type ext3 (rw)
/dev/sda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
/dev/sdd1 on /media/disk type vfat (rw,nosuid,nodev,noatime,
uhelper=hal,uid=500,utf8,shortname=lower)
twin4:/musicbox on /misc/musicbox type nfs4 (rw,addr=192.168.1.4)
使用umount来卸载设备。
卸载一个设备需要把所有剩余的数据写入这个设备,所以设备可以被安全地移除。
如没有卸载设备,就移除了它,就有可能没有把注定要发送到设备中的数据输送完毕。
在某些情况下, 这些数据可能包含重要的目录更新信息,这将导致文件系统损坏,这是发生在计算机中的最坏的事情之一。
使用
ls /dev
命令,来查看本机上的设备。Dev for devices.
[me@linuxbox ~]$ sudo tail -f /var/log/messages
查看系统日志。tail将文件输出到标准输出。-f可以循环读取(实时查看变化)。
Fdisk
fdisk用来操作分区。
[me@linuxbox ~]$ sudo umount /dev/sdb1
[me@linuxbox ~]$ sudo fdisk /dev/sdb
首先卸载一个设备,并调用fdisk程序。
程序启动后会出现提示。
每个字母代表了不同的操作。
P |
打印分区表 |
l |
查看可用的分区类型列表 |
t |
更改一个分区的id号码 |
w |
将此前修改应用。 |
/dev/sdb 指整个设备,/dev/sdb1指这个设备的第一分区
mkfs
创建新的文件系统。
sudo mkfs -t ext3 /dev/sdb1
这表示在设备/dev/sdb1中,创建一个新的文件系统。系统类型由参数-t ext3指定。
fsck
检查磁盘。使用这个命令通常意味着磁盘坏了(物理意义上)。
CD-ROM部分略。用到再看。
使用md5sum可以计算hash。
第十七章 网络系统
Ping
不说了
Traceroute
1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms
输出的每一行会如上所示。包含跳数,主机名,IP地址,和性能。
被隐藏起来的路由去信息会用星号*显示。
Netstat
很重要,用来查看网络设置。
使用-ie选项:
[me@linuxbox ~]$ netstat -ie
eth0 Link encap:Ethernet HWaddr 00:1d:09:9b:99:67
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:238488 errors:0 dropped:0 overruns:0 frame:0
TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100 RX bytes:153098921 (146.0 MB) TX
bytes:261035246 (248.9 MB) Memory:fdfc0000-fdfe0000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
...
至少有两个网络接口:eth0和lo,分别代表以太网接口和local。
首先查看第四行显示的UP,证明有在正常工作。
以及第二行的IP地址,证明DHCP正常工作。
使用-r选项查看路由表
[me@linuxbox ~]$ netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
第一行显示了目的地 192.168.1.0。IP 地址以零结尾是指网络,而不是独立主机, 所以这个目的地意味着局域网中的任何一台主机。
下一个字段,Gateway, 是网关(路由器)的名字或 IP 地址,用它来连接当前的主机和目的地的网络。 若这个字段显示一个星号,则表明不需要网关。
Wget
不仅实现了ftp的基本功能,还能下载网页,下载多个文件。
Ssh
SSH 由两部分组成。SSH 服务端运行在远端主机上,在端口 22 上监听收到的外部连接,而 SSH 客户端用在本地系统中,用来和远端服务器通信。
如果当前客户端的用户名和远端服务器的用户名不同,可以使用以下形式指定用户:
ssh bob@remote-sys
Scp
从服务器上拷贝一个交document.txt的文件到我家
scp remote-sys:document.txt .
第十八章 查找文件
Locate
locate实属简单。
[me@linuxbox ~]$ locate zip | grep bin
find
而 find 程序能基于各种各样的属性 搜索一个给定目录。
例如find ~会列出~下的所有文件。
Find -type b
可以只列出指定类型的文件。参数表如下。
文件类型 |
描述 |
b |
块特殊设备文件 |
c |
字符特殊设备文件 |
d |
目录 |
f |
普通文件 |
l |
符号链接 |
find ~ -type f -name "*.JPG" -size +1M | wc -l
还可使用-name和-size来指定名字和大小。
+1M表示大于1M,-1M表示小于,没有符号表示正好。
-size参数列表
字符 |
单位 |
b |
512 个字节块。如果没有指定单位,则这是默认值。 |
c |
字节 |
w |
两个字节的字 |
k |
千字节(1024个字节单位) |
M |
兆字节(1048576个字节单位) |
G |
千兆字节(1073741824个字节单位) |
find的其它参数
测试条件 |
描述 |
-cmin n |
匹配内容或属性最后修改时间正好在 n 分钟之前的文件或目录。 指定少于 n 分钟之前,使用 -n,指定多于 n 分钟之前,使用 +n。 |
-cnewer file |
匹配内容或属性最后修改时间晚于 file 的文件或目录。 |
-ctime n |
匹配内容和属性最后修改时间在 n*24小时之前的文件和目录。 |
-empty |
匹配空文件和目录。 |
-group name |
匹配属于一个组的文件或目录。组可以用组名或组 ID 来表示。 |
-iname pattern |
就像-name 测试条件,但是不区分大小写。 |
-inum n |
匹配 inode 号是 n的文件。这对于找到某个特殊 inode 的所有硬链接很有帮助。 |
-mmin n |
匹配内容被修改于 n 分钟之前的文件或目录。 |
-mtime n |
匹配的文件或目录的内容被修改于 n*24小时之前。 |
-name pattern |
用指定的通配符模式匹配的文件和目录。 |
-newer file |
匹配内容晚于指定的文件的文件和目录。这在编写执行备份的 shell 脚本的时候很有帮。 每次你制作一个备份,更新文件(比如说日志),然后使用 find 命令来判断哪些文件自从上一次更新之后被更改了。 |
-nouser |
匹配不属于一个有效用户的文件和目录。这可以用来查找 属于被删除的帐户的文件或监测攻击行为。 |
-nogroup |
匹配不属于一个有效的组的文件和目录。 |
-perm mode |
匹配权限已经设置为指定的 mode的文件或目录。mode 可以用 八进制或符号表示法。 |
-samefile name |
类似于-inum 测试条件。匹配和文件 name 享有同样 inode 号的文件。 |
-size n |
匹配大小为 n 的文件 |
-type c |
匹配文件类型是 c 的文件。 |
-user name |
匹配属于某个用户的文件或目录。这个用户可以通过用户名或用户 ID 来表示。 |
~可以使用括号(要加上转义符),-not -or来控制逻辑。逻辑存在短路。
[me@linuxbox ~]$ find ~ \( -type f -not -perm 0600 \) -or \( -type d -not -perm 0700 \)
使用以下参数来对find到的文件进行操作。
操作 |
描述 |
-delete |
删除当前匹配的文件。 |
-ls |
对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。 |
|
把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是 默认操作。 |
-quit |
一旦找到一个匹配,退出。 |
除了表中的行为,也可以使用下列命令自定义行为:
-exec rm '{}' ';'
注意要使用单引号转义。
find的结果是无序的,取决于实际存储。
提高find的效率:
低效率:
ls -l file1
ls -l file2
高效率:
ls -l file1 file2
xargs
find ~ -type f -name 'foo*' -print | xargs ls -l
xargs 会为 ls 命令构建 参数列表,然后执行 ls 命令。
批量创建文件/文件夹:
[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
touch 命令通常被用来设置或更新文件的访问,更改,和修改时间。
如果一个文件名参数是一个 不存在的文件,则会创建一个空文件。
Stat
超级加强版的ls。
第十九章 归档和备份
Gzip
使用gzip来压缩文件,之后会用压缩后的文件取代之前的文件。
使用gunzip来解压。压缩后会加上.gz的后缀。
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me me 15738 2008-10-14 07:15 foo.txt
[me@linuxbox ~]$ gzip foo.txt
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me me 3230 2008-10-14 07:15 foo.txt.gz
Bizip2
舍弃压缩速度,获得更好的压缩率。使用方法和gzip一样
Tar
Tar c/x/r/t +z/v/f
模式 |
说明 |
c |
为文件和/或目录列表创建归档文件。 |
x |
抽取归档文件。 |
r |
追加具体的路径到归档文件的末尾。 |
t |
列出归档文件的内容。 |
注意不能使用绝对路径,只能使用相对路径。
Zip
windows上的那个zip,不多说
rsync
对应rsync协议,在本机和服务器上同步数据,会自动传输最小量的数据。
可以在本机到服务器,也可以服务器到本机,可以本机到本机,但总之不能服务器到服务器。
例如:
Rsync -av foo1 foo2
会将foo1拷贝到同目录下,命名为foo2。 -a代表递归和保护文件,-v代表输出提示语句。
增加--delete,来允许其删除在源目录中不存在的文件。适合备份。
第二十章 正则表达式
Grep
查找文本中的行。
选项 |
描述 |
-i |
忽略大小写。不会区分大小写字符。也可用--ignore-case 来指定。 |
-v |
不匹配。通常,grep 程序会打印包含匹配项的文本行。这个选项导致 grep 程序只会打印不包含匹配项的文本行。也可用--invert-match 来指定。 |
-c |
打印匹配的数量(或者是不匹配的数目,若指定了-v 选项),而不是文本行本身。 也可用--count 选项来指定。 |
-l |
打印包含匹配项的文件名,而不是文本行本身,也可用--files-with-matches 选项来指定。 |
-L |
相似于-l 选项,但是只是打印不包含匹配项的文件名。也可用--files-without-match 来指定。 |
-n |
在每个匹配行之前打印出其位于文件中的相应行号。也可用--line-number 选项来指定。 |
-h |
应用于多文件搜索,不输出文件名。也可用--no-filename 选项来指定。 |
简单的查找:
[me@linuxbox ~]$ grep bzip dirlist*.txt
dirlist-bin.txt:bzip2
dirlist-bin.txt:bzip2recover
同时,使用-l输出查找到的文件,而非行:
[me@linuxbox ~]$ grep -l bzip dirlist*.txt
dirlist-bin.txt
原意字符
以bzip为例,这代表文中确实出现了这四个字符,并且是连续的。
除了以下的元字符,都是原意字符:
^ $ . [ ] { } - ? * + ( ) | \
.
一个圆点被用来匹配有且仅有的一个字符。
^和$
^zip表示zip在行首,可以理解为每行都是^abc$表示的,这样就可以将这两个锚定字符理解为原意字符。
[]
方括号中的字符串中的任意一个会被匹配。也就是说从方括号中选一个。
grep -h '[bg]zip' dirlist*.txt
bzip2
bzip2recover
gzip
方括号中的元字符除了^和-,都会被解释为原意。
^作为否定
[me@linuxbox ~]$ grep -h '[^bg]zip' dirlist*.txt
bunzip2
gunzip
funzip
gpg-zip
…
这里在方括号中的第一处填入^,使得匹配了除了b和g之外的字符。
如果不是第一处就是^,那么会被当作原意字符处理。
-
连字符用来方便地在方括号中节约时间。
[me@linuxbox ~]$ grep -h '^[A-Za-z0-9]' dirlist*.txt
这表示所有数字或者字母开头的文件名。
方括号中是完备的,^和-如果位置正确,不会查不到。如果我们想把-作为原意使用,将其放在第一个就好了。
[me@linuxbox ~]$ grep -h '[-AZ]' dirlist*.txt
posix字符集
有时使用A-Z不能得到预期的结果,因为并不全是按照ASCII码编写的。
按照以下的字符集可以得到预期的结果,但是这不是正则表达式,而是shell展开。
字符集 |
说明 |
[:alnum:] |
字母数字字符。在 ASCII 中,等价于:[A-Za-z0-9] |
[:word:] |
与[:alnum:]相同, 但增加了下划线字符。 |
[:alpha:] |
字母字符。在 ASCII 中,等价于:[A-Za-z] |
[:blank:] |
包含空格和 tab 字符。 |
[:cntrl:] |
ASCII 的控制码。包含了0到31,和127的 ASCII 字符。 |
[:digit:] |
数字0到9 |
[:graph:] |
可视字符。在 ASCII 中,它包含33到126的字符。 |
[:lower:] |
小写字母。 |
[:punct:] |
标点符号字符。在 ASCII 中,等价于:[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~] |
[:print:] |
可打印的字符。在[:graph:]中的所有字符,再加上空格字符。 |
[:space:] |
空白字符,包括空格、tab、回车、换行、vertical tab 和 form feed.在 ASCII 中, 等价于:[ \t\r\n\v\f] |
[:upper:] |
大写字母。 |
[:xdigit:] |
用来表示十六进制数字的字符。在 ASCII 中,等价于:[0-9A-Fa-f] |
bre和ere
BRE是基本的正则表达式,ERE是扩展的。
之前提到的
^ $ . [ ] *
属于基本正则表达式元字符,而这些是扩展的:
( ) { } ? + |
一个更怪的地方就是,
大小括号,在ERE中,只有被\转义之后才是元字符。
真是不能更怪了。
使用ere时,需要给grep加上-E,或者直接使用egrep。
|
使用 | 来表示或。逻辑不清时,使用小括号分隔。
grep -Eh '^(bz|gz|zip)' dirlist*.txt
?
问号? 使前面的元素可有可无。
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$'
(555) 123-4567
*
和.的使用方法类似,但是要宽松的多:不必匹配恰好一个,0个或者多个也可以。
+
用来限定,前面的匹配项必须出现。
[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'
{}
限定前面的匹配项匹配到的字符个数
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567
{n} |
匹配前面的元素,如果它确切地出现了 n 次。 |
{n,m} |
匹配前面的元素,如果它至少出现了 n 次,但是不多于 m 次。 |
{n,} |
匹配前面的元素,如果它出现了 n 次或多于 n 次。 |
{,m} |
匹配前面的元素,如果它出现的次数不多于 m 次。 |
应用
查找不正确的电话号码:
[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$' phonelist.txt
(292) 108-518
(129) 44-1379
-v用来取反,[0-9]表示数字,{3}表示匹配出三个字符。最好正则都用单引号括起来。
在vim中使用/+正则可以起到同样的效果。