The Linux Command Line学习笔记(二)

第十一章:进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
这一章将介绍以下命令:
这一章将介绍以下命令:
ps – 报告当前进程快照
top – 显示任务
jobs – 列出活跃的任务
bg – 把一个任务放到后台执行
fg – 把一个任务放到前台执行
kill – 给一个进程发送信号
killall – 杀死指定名字的进程
shutdown – 关机或重启系统

系统分配给每个进程一个数字,这个数字叫做进程ID 或 PID。PID 号按升序分配,init 进程的 PID 总是1。
查看进程 ps。ps 程序有许多选项,它最简单地使用形式是这样的:

[me@linuxbox ~]$ ps
PID TTY TIME CMD
5198 pts/1 00:00:00 bash
10129 pts/1 00:00:00 ps
TTY 是“Teletype” 的简写,是指进程的控制终端,TIME 字段表示 进程所消耗的
CPU 时间数量,CMD代表运行的命令

[me@linuxbox ~]$ ps x # 可以得到更多关于系统运行状态的信息:
输出结果中,新添加了一栏,标题为 STAT 。STAT 是 “state” 的简写,它揭示了进程当前状态:
表11-1: 进程状态
| 状态 | 意义 |
| --- | --- |
| R | 运行。这意味着,进程正在运行或准备运行。 |
| S | 正在睡眠。 进程没有运行,而是,正在等待一个事件, 比如说,一个按键或者网络数据包。 |
| D | 不可中断睡眠。进程正在等待 I/O,比方说,一个磁盘驱动器的 I/O。 |
| T | 已停止. 已经指示进程停止运行。稍后介绍更多。 |
| Z | 一个死进程或“僵尸”进程
| < | 一个高优先级进程
| N | 低优先级进程。

另一个流行的选项组合是 “aux”(不带开头的”-“字符)。这会给我们更多信息:
[me@linuxbox ~]$ ps aux

用 top 命令动态查看进程
[me@linuxbox ~]$ top
top 显示结果由两部分组成: 最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。输入q退出top程序。

把一个进程放置到后台(执行)
启动一个程序,让它立即在后台 运行,我们在程序命令之后,加上”&”字符:

[me@linuxbox ~]$ xlogo & #xlogo打开一个试验窗口
[1] 28236 # 工作号为1
[me@linuxbox ~]$
如果我们运行 ps 命令,可以看到我们的进程:

[me@linuxbox ~]$ ps
PID TTY TIME CMD
10603 pts/1 00:00:00 bash
28236 pts/1 00:00:00 xlogo
28239 pts/1 00:00:00 ps
执行 jobs 命令,我们可以看到这个输出列表:
[me@linuxbox ~]$ jobs
[1]+ Running xlogo &

进程返回到前台
一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。使用 fg 命令,让一个
进程返回前台执行:

[me@linuxbox ~]$ jobs
[1]+ Running xlogo &
[me@linuxbox ~]$ fg %1
xlogo
fg 命令之后,跟随着一个百分号和工作序号,输入 Ctrl-c 来终止 xlogo 程序

停止一个进程,输入 Ctrl-z,可以停止一个前台进程。
使用 fg 命令,可以恢复程序到前台运行,或者用 bg 命令把程序移到后台。

Signals
kill 命令被用来“杀死”程序。这样我们就可以终止需要杀死的程序。指定我们想要终止的进程 PID。也可以用 jobspec(例如,“%1”)来代替 PID。

[me@linuxbox ~]$ xlogo &
[1] 28401
[me@linuxbox ~]$ kill 28401
[1]+ Terminated xlogo
这个 kill 命令不是确切地“杀死”程序,而是给程序 发送信号。当程序 接到信号之后,则做出响应。
通过 kill 命令给进程发送信号,kill 命令被用来给程序发送信号。它最常见的语法形式看起来像这样(默认TERM终止信号):
kill [-signal] PID...
表 11-4: 常用信号
| 编号 | 名字 | 含义 |
| 1 | HUP | 挂起,这意味着,当发送这个信号到一个守护进程后, 这个进程会重新启动,并且重新读取它的配置文件
| 2 | INT | 中断。实现和 Ctrl-c 一样的功能,由终端发送。通常,它会终止一个程序。 |
| 15 | TERM | 终止。这是 kill 命令发送的默认信号
| 18 | CONT | 继续。在停止一段时间后,进程恢复运行。 |
| 19 | STOP | 停止。这个信号导致进程停止运行,而没有终止
例如:
[me@linuxbox ~]$ kill -1 13546 #挂起 工作号为13546的进程

第十二章:shell环境

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
在这一章,我们将用到以下命令:
printenv - 打印部分或所有的环境变量
set - 设置 shell 选项
export — 导出环境变量,让随后执行的程序知道。
alias - 创建命令别名

shell 在环境中存储了两种基本类型的数据,虽然对于 bash 来说,很大程度上这些类型是不可 辨别的。
它们是环境变量和 shell 变量。Shell 变量是由 bash 存放的少量数据,而剩下的基本上 都是环境变量

[me@linuxbox ~]$ printenv | less #显示环境变量

非登录 shell 会话也会继承它们父进程的环境设置,通常是一个登录 shell

曾经是否感到迷惑 shell 是怎样知道到哪里找到我们在命令行中输入的命令的?例如,当我们输入 ls 后,
shell 不会查找整个计算机系统,来找到 /bin/ls(ls 命令的绝对路径名),而是,它查找一个目录列表,
这些目录包含在 PATH 变量中。

通过添加字符串 $HOME/bin 到 PATH 变量值的末尾,则目录 $HOME/bin 就添加到了命令搜索目录列表中。这意味着当我们想要在自己的家目录下,创建一个目录来存储我们自己的私人程序时,shell 已经给我们准备好了。我们所要做的事就是 把创建的目录叫做 bin

按照通常的规则,添加目录到你的 PATH 变量或者是定义额外的环境变量,要把这些更改放置到
.bash_profile 文件中. 对于其它的更改,要放到 .bashrc 文件中。(修改通过vi编辑器)

移动 鼠标到文件的最后一行,然后添加以下几行到文件 .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 的修改不会生效,直到我们关闭终端会话,再重新启动一个新的会话, 因为
.bashrc 文件只是在刚开始启动终端会话时读取。然而,我们可以强迫 bash 重新读取修改过的 .bashrc
文件,使用下面的命令:
[me@linuxbox ~]$ source .bashrc

第十三章:VI简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
[me@linuxbox    ~]$    vi    #启动vi:q!                          #加感叹号是强制退出
小贴示:如果你在 vi 中“迷失”了,试着按下 Esc 键两次来找到路(回到普通模式)。

编辑模式
再次启动 vi,这次传递给 vi 一个不存在的文件名。这也是用 vi 创建新文件的方法。
[me@linuxbox ~]$ vi foo.txt
当 vi 启动后,进入 的是命令模式。这种模式下,几乎每个按键都是一个命令,所以如果我们打算输入字符,vi 会发疯,弄得一团糟。
插入模式
为了在文件中添加文本,首先我们必须进入插入模式。按下”i”按键进入插入模式,按下 Esc 按键,返回命令模式。

-- INSERT --

保存我们的工作
在命令模式下输入一个 ex 命令(ex操作为命令模式下的操作)。 通过按下”:”键。为了写入我们修改的文件,我们在冒号之后输入”w”字符,然后按下回车键

:w

移动光标
当在 vi 命令模式(不是插入模式)下时,vi 提供了大量的移动命令
| 0 (零按键) | 移动到当前行的行首。 |
| $ | 移动到当前行的末尾。 |
| Ctrl-f or Page Down | 向下翻一页 |
| Ctrl-b or Page Up | 向上翻一页 |
| G | 移动到文件末尾。 |

基本编辑
如果我们按下“u” 按键,当在命令模式下,vi 将会撤销你所做的最后一次修改
如果我们想要在这个句子的末尾添加一些文本,输入”a”,在光标处,vi 进入插入模式。”A”命令,在行尾进入插入模式。另外还有:
| o | 当前行的下方打开一行。 |,进入插入模式
| O | 当前行的上方打开一行。 | ,进入插入模式
记住按下 Esc 按键来退出插入模式。

删除文本
表13-3: 文本删除命令
| 命令 | 删除的文本 |
|-------|---------|
| x | 当前字符 |
| 3x | 当前字符及其后的两个字符。 |
| dd | 当前行。 |
| 5dd | 当前行及随后的四行文本。 |
| d$ | 从光标位置开始到当前行的行尾。 |
| d0 | 从光标位置开始到当前行的行首。 |

剪切,复制和粘贴文本
这个 d 命令不仅删除文本,它还“剪切”文本。每次我们使用 d 命令,删除的部分被复制到一个 粘贴缓
冲区中(看作剪切板)。过后我们执行小 p 命令把剪切板中的文本粘贴到光标位置之后, 或者是大 P 命
令把文本粘贴到光标之前。

y 命令用来“拉”(复制)文本。p命令粘贴。
表13-4: 复制命令
| 命令 | 复制的内容 |
|-------|---------|
| yy | 当前行。 |
| 5yy | 当前行及随后的四行文本。 |
| y$ | 从当前光标位置到当前行的末尾。 |
| y0 | 从当前光标位置到行首。 |

查找和替换
查找一行: f 命令查找一行,移动光标到下一个所指定的字符上。例如,命令 fa 会把光标定位到同一行中 下一个出现的”a”字符上。在一行中执行了字符的查找命令之后,通过输入分号来重复这个查找。

查找整个文件:移动光标到下一个出现的单词或短语上,使用 / 命令。下一步,输入要查找的单词或短语后, 按下回车。光标就会移动到下一个包含所查找字符串的位置。通过 n 命令来重复先前的查找

全局查找和替代vi 使用 ex 命令来执行查找和替代操作(vi 中叫做“替换”)。把整个文件中的单词“Line”更改为“line”, 我们输入以下命令:

1
:%s/Line/line/g

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
需要用户确认的替换命令。通过添加一个”c”字符到这个命令的末尾,来完成    这个替换命令。例如:

:%s/line/Line/gc
这个命令会把我们的文件恢复先前的模样;然而,在执行每个替换命令之前,vi 会停下来, 通过下面的信
息,来要求我们确认这个替换:

replace with Line (y/n/a/q/l/^E/^Y)?
表13-5: 替换确认按键
| 按键 | 行为 |
|-------|---------|
| y | 执行替换操作 |
| n | 跳过这个匹配的实例 |
| a | 对这个及随后所有匹配的字符串执行替换操作。 |
| q or esc | 退出替换操作。 |
| l | 执行这次替换并退出。l 是 “last” 的简写。 |
| Ctrl-e, Ctrl-y | 分别是向下滚动和向上滚动。用于查看建议替换的上下文。 |

文件之间转换
从这个文件转到下一个文件,使用这个 ex 命令:

:n
回到先前的文件使用:

:N
当我们从一个文件移到另一个文件时,如果当前文件没有保存修改,vi 会阻止我们转换文件, 这是 vi 强制执行的政策。在命令之后添加感叹号,可以强迫 vi 放弃修改而转换文件。
我们可以查看正在编辑的文件列表,使用:buffers 命令
:buffers

1 # "foo.txt" line 1
2 %a "ls-output.txt" line 0
Press ENTER or type command to continue
注意:你不同通过:n 或:N 命令在由:e 命令加载的文件之间进行切换。这时要使用:buffer 命令, 其后加上缓冲区号码,来转换文件。

从一个文件复制内容到另一个文件
以打开的两个文件为例,首先转换到缓冲区1(foo.txt) ,输入:

:buffer 1

我们应该得到以下输出:

The quick brown fox jumped over the lazy dog. It was cool.
Line 2
Line 3
Line 4
Line 5
下一步,把光标移到第一行,并且输入 yy 来复制这一行。转换到第二个缓冲区,输入:

:buffer 2
现在屏幕会包含一些文件列表(这里只列出了一部分):

total 343700
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
....
移动光标到第一行,输入 p 命令把我们从前面文件中复制的一行粘贴到这个文件中:

total 343700
The quick brown fox jumped over the lazy dog. It was cool.
-rwxr-xr-x 1 root root 31316 2007-12-05 08:58 [
....

保存工作
像 vi 中的其它操作一样,有几种不同的方法来保存我们所修改的文件。我们已经研究了:w 这个 ex 命令,但还有几种方法,可能我们也觉得有帮助。
在命令模式下,输入 ZZ 就会保存并退出当前文件

第十四章:自定制shell提示符

并不是每个人都会花心思来更改提示符,因为通常默认的提示符就很让人满意

第十五章:软件包管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
软件包管理是指系统中一种安装和维护软件的方法,inux    系统中几乎所有的软件都可以在互联网上找到。其中大多数软件由发行商以    包文件的形式提供,剩下的则以源码形式存在,可以手动安装。在后面章节里,我们将会谈谈怎样    通过编译源码来安装软件。

查找资源库中的软件包
| Red Hat | yum search search_string |
例如:yum search emacs

从资源库中安装一个软件包
| Red Hat | yum install package_name |

通过软件包文件来安装软件
如果从某处而不是从资源库中下载了一个软件包文件,可以使用底层工具来直接(没有经过依赖解析)安装它。
| Red Hat | rpm -i package_file |

卸载软件
| Red Hat | yum erase package_name |

经过资源库来更新软件包
| Red Hat | yum update |

经过软件包文件来升级软件
如果已经从一个非资源库网站下载了一个软件包的最新版本,可以安装这个版本,用它来 替代先前的版本:
| Red Hat | rpm -U package_file |

列出所安装的软件包
| Red Hat | rpm -qa |

确定是否安装了一个软件包
| Red Hat | rpm -q package_name |

查找安装了某个文件的软件包
| Red Hat | rpm -qf file_name |
-------------Thanks for Reading!-------------