《Linux 命令行与 shell 脚本编程大全(第 3 版)》读书笔记

本贴最后更新于 1826 天前,其中的信息可能已经时移世改


image.png

下载链接:https://leif.fun/downloads/books/shell/Linux 命令行与 shell 脚本编程大全.第 3 版.pdf

百度云:链接:https://pan.baidu.com/s/1bV1S6Rb7A9han78-Y2j-PA 密码:82v1

2019 年 09 月 19 日

第一部分

第 3 章 基本的 bash shell 命令

3.4 浏览文件系统

常见 Linux 目录名称

目录 用途
/ 虚拟目录的根目录。通常不会在这里存储文件
/bin 二进制目录,存放许多用户级的 GNU 工具
/boot 启动目录,存放启动文件
/dev 设备目录,Linux 在这里创建设备节点
/etc 系统配置文件目录
/home 主目录,Linux 在这里创建用户目录
/lib 库目录,存放想 IT 和应用程序的库文件夹
/media 媒体目录,可移动媒体设备的常用挂载点
/mnt 挂载目录,另一个可移动媒体设备的常用挂载点
/opt 可选目录,常用于存放第三方软件包和数据文件
/proc 进程目录,存放现有硬件及当前进程的相关信息
/root root 用户的主目录
/sbin 系统二进制目录,存放许多 GNU 管理员级工具
/run 运行目录,存放系统运作时的运行时数据
/srv 服务目录,存放本地服务的相关文件
/sys 系统目录,存放系统硬件信息的相关文件
/tmp 临时目录,可以在该目录中创建和删除临时工作文件
/usr 用户二进制目录,大量用户级的 GNU 工具和数据文件都存储在这里
/var 可变目录,用以存放经常变化的文件,比如日志文件

3.5 文件和目录列表

3.5.1 基本列表功能

ls 命令最基本的形式会显示当前目录下的文件和目录:

root@ubuntu:~# ls
examples.desktop  公共的  模板  视频  图片  文档  下载  音乐  桌面

用带 —F 参数的 ls 命令区分文件和目录

root@ubuntu:~# ls -F
examples.desktop  公共的/  模板/  视频/  图片/  文档/  下载/  音乐/  桌面/

-F 会在可执行文件后面加上 *

显示隐藏文件和普通文件:

root@ubuntu:~# ls -a
.              .dbshell          .ICEauthority   .pm2              .sudo_as_admin_successful  模板
..             .dbus             .local          .presage          .viminfo                   视频
.bash_history  .dmrc             .mongorc.js     .profile          .wget-hsts                 图片
.bash_logout   examples.desktop  .mysql_history  .python_history   .Xauthority                文档
.bashrc        .gconf            .node-gyp       .rnd              .xinputrc                  下载
.cache         .gnupg            .npm            .selected_editor  .xsession-errors           音乐
.config        .hardinfo         .nvm            .ssh              公共的                      桌面

显示当前目录下包含的子目录中的文件:

root@ubuntu:~# ls -F -R
.:
examples.desktop  公共的/  模板/  视频/  图片/  文档/  下载/  音乐/  桌面/

./公共的:

./模板:

./视频:

./图片:

./文档:

./下载:

./音乐:

./桌面:

窍门:命令可以合并为 ls -FR
如果目录结构很庞大的话,输出内容会变得很长,故一般不推荐这么做

3.5.2 显示长列表

-l 参数会产生长列表格式输出

root@medcaptain-virtual-machine:~# ls -l
总用量 44
-rw-r--r-- 1 ubuntu ubuntu 8980 11月 20  2018 examples.desktop
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 公共的
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 模板
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 视频
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 图片
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 文档
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 下载
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 音乐
drwxr-xr-x 2 ubuntu ubuntu 4096 11月 20  2018 桌面

信息解释

  • 文件类型,比如目录(d)、文件(-)、字符型文件(c)、或块设备(b);
  • 文件的权限;
  • 文件的硬链接总数;
  • 文件属主的用户名;
  • 文件属组的组名;
  • 文件的大小(字节单位);
  • 文件的上次修改时间;
  • 文件名或目录名。

3.5.3 过滤输出列表

简单文本匹配

root@ubuntu:~# ls -l examples.desktop
-rw-r--r-- 1 ubuntu ubuntu 8980 11月 20  2018 examples.desktop

ls 可以识别标准通配符,并在过滤器中使用它们进行模式匹配:

  • 问号(?)代表一个字符
  • 星号(*)代表零个或多个字符

替代任意位置的单个字符

root@ubuntu:~# ls -l my_scr?pt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_scrapt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_script
root@ubuntu:~# ls -l my*
-rw-r--r-- 1 root root 0 9月  18 11:45 my_file
-rw-r--r-- 1 root root 0 9月  18 11:43 my_scrapt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_script
root@ ubuntu:~# ls -l my_s*t
-rw-r--r-- 1 root root 0 9月  18 11:43 my_scrapt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_script

在过滤器中使用星号和问号被称为 文件扩展匹配,指的是使用通配符进行模式匹配的过程。通配符正式的名称叫做 元字符通配符。除了星号和问号之外,还有更多的元字符通配符可用用于文件扩展匹配。如中括号 []

root@ubuntu:~# ls -l my_scr[ai]pt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_scrapt
-rw-r--r-- 1 root root 0 9月  18 11:43 my_script

使用了中括号以及在特定位置上可能出现的两中字符:a 或 i。中括号表示一个字符位置并给出多个可能的选择

也可以指定字符范围,例如 [a-i]

root@ubuntu:~# ls -l f[a-i]ll
-rw-r--r-- 1 root root 0 9月  18 13:50 fall
-rw-r--r-- 1 root root 0 9月  18 13:50 fell
-rw-r--r-- 1 root root 0 9月  18 13:50 fill

可以使用感叹号 ! 将不需要的内容排除在外

root@ubuntu:~# ls -l f[!a]ll
-rw-r--r-- 1 root root 0 9月  18 13:50 fell
-rw-r--r-- 1 root root 0 9月  18 13:50 fill

3.6 处理文件

3.6.1 创建文件

创建空文件

root@ubuntu:~# touch test_one
root@ubuntu:~# ls -l test_one
-rw-r--r-- 1 root root 0 9月  18 13:58 test_one

改变文件的修改时间,此操作并不会更改文件内容

root@ubuntu:~# ls -l test_one
-rw-r--r-- 1 root root 0 9月  18 13:58 test_one
root@ubuntu:~# touch test_one
root@ubuntu:~# ls -l test_one
-rw-r--r-- 1 root root 0 9月  18 13:59 test_one

若指向改变访问时间,可使用 -a 参数

root@ubuntu:~# ls -l test_one
-rw-r--r-- 1 root root 0 9月  18 13:59 test_one
root@ubuntu:~# touch -a test_one
root@ubuntu:~# ls -l test_one
-rw-r--r-- 1 root root 0 9月  18 13:59 test_one
root@ubuntu:~# ls -l --time=atime test_one
-rw-r--r-- 1 root root 0 9月  18 14:02 test_one

只是用 ls -l 命令,并不会显示访问时间,这是因为默认显示的是修改时间,若想查看访问时间,需要加入参数:--time=atime

3.6.2 复制文件

使用 cp 复制文件时,若目标文件已经存在,则建议加上 -i 选项,强制 shell 询问是否覆盖已有文件。

root@ubuntu:~# cp -i test_one test_two
cp:是否覆盖'test_two'? n

cp 也支持 * 通配符

3.6.4 链接文件

在系统上需维护同一文件的两份或多份副本,可以采用保存一份物理文件副本和多个虚拟副本的方式,这种虚拟的副本就成为 链接。链接是目录中指向文件真实路径的占位符,在 Linux 中有两种不同类型的文件链接:

  • 符号链接
  • 硬链接

符号链接:实实在在的文件,指向存放在虚拟目录结构中某个地方的另一个文件,这两个通过符号链接在一起的文件,彼此的内容并不相同
要创建一个文件的符号链接,则此原始文件必须存在,然后使用 ln 命令以及 -s 选项来创建符号链接

root@ubuntu:~# ls -l data_file
-rw-r--r-- 1 root root 0 9月  18 14:12 data_file
root@ ubuntu:~# ln -s data_file sl_data_file
root@ ubuntu:~# ls -l *data_file
-rw-r--r-- 1 root root 0 9月  18 14:12 data_file
lrwxrwxrwx 1 root root 9 9月  18 14:13 sl_data_file -> data_file

sl_data_file 和 data_file 这两个文件大小并不一样,这是因为 sl_data_file 仅仅只是指向 data_file 而已,它们的内容并不相同,是两个完全不同的文件(类似 Windows 下的快捷方式和执行程序的区别

另一种证明链接文件是否是独立文件的方法是查看 inode 编号,这是识别文件或目录的唯一数字,给 ls 命令加 -i 参数即可

root@ubuntu:~# ls -i *data_file
31591688 data_file  31591689 sl_data_file

注意:删除原始文件过后,符号链接的文件也会跟着消失,虽然 ls 命令也会看到文件存在的踪迹,但是你无法打开它,它们前后显示的颜色会不一样

image.png

image.png

root@ubuntu:~# cat sl_data_file
cat: sl_data_file: 没有那个文件或目录

硬链接会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是他们才能够根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用 ln 命令时不需要加额外参数。

root@ubuntu:~# ln code_file h1_code_file
root@ubuntu:~# ls -li *code_file
31591688 -rw-r--r-- 2 root root 0 9月  18 14:31 code_file
31591688 -rw-r--r-- 2 root root 0 9月  18 14:31 h1_code_file

由上述 inode 编号得知,它们为同一个文件,它们的大小也一模一样,另外,链接计数(列表中第三项)显示这两个文件都有两个链接。(类似拷贝文件

注意:只能对同一个存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能用符号链接

复制文件时,可以直接创建原始文件的另一个链接。同一个文件可以拥有多个链接,但是千万别创建软链接文件的软链接。这回形成混乱的链接链,不仅容易断裂,还会造成各种麻烦。
当源文件删除时,不会影响链接文件,硬链接的创建,不会像符号链接那样有明显的 -> 标志

3.7 处理目录

3.7.2 删除目录

删除目录命令:rmdir
默认情况下 rmdir 只能删除空目录,若想使用这一命令,则必须先把改文件夹下的所有内容删除掉,而且 rmdir 没有 -i 选项

3.8 查看文件内容

3.8.1 查看文件类型

file 命令

root@ubuntu:~# file my_file
my_file: ASCII text

上述例子中的文件是一个文本文件,file 命令不仅可以确定文件中包含的文本信息,还能确定该文本文件中的字符编码,ASCII

文件夹

root@ubuntu:~# file new_dir
new_dir: directory

链接文件

root@ubuntu:~# file sl_data_file
sl_data_file: broken symbolic link to data_file

3.8.2 查看整个文件

1.cat 命令

显示文本文件中所有内容

cat test1

给所有行加上行号

cat -n test1

只给有文本的行加上行号

cat -b test1

隐藏制表符(TAB)

cat -T test1

—T 参数会用 ^I 字符组合去替换稳重的所有制表符。

2.more 命令

more <file_name>

image.png

more 命令只支持文本文件中的基本移动,高级功能可以参考 less 命令

3.less 命令

less <file_name>

less 作为 more 的升级版,可以实现在文本文件中前后翻动,而且还有一些高级搜索的功能

less 命令是支持鼠标滚动的,可以识别键盘上下键以及上下翻页键而 more 只支持键盘操控,支持空格和回车翻页,但是不支持上下键

3.8.3 查看部分文件

1.tail 命令
tail 默认显示文本末尾 10 行内容

tail <file_name>

若想修改显示行数,请加 -n 参数

tail -n <line_num> <file_name>

若其他进程使用该文件,你可以使用 -f 参数实时预览文件内容变化,实时监控系统日志可以用到。

2.head 命令
head 命令默认显示文件头部 10 行内容

head <file_name>

类似 tail 命令,head 也支持 -n 参数

head -n <line_num> <file_name>

因为文件头内容通常不会改变,所以 head 不支持 -f 参数和特性

扩展:如何查看一个文件第 m 行到第 n 行的数据
例如一个文件 test,内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

现需要查询第 3 行到第 10 行的数据,分两种情况:
1.知道一共有多少行的情况

head -10 test | tail -8
或
tail -13 test | head -8

即:

head -<结束行号> file | tail -<结束行号-初始行号+1>
或
tail -<总行数-初始行号+1> file | head -<束行号-初始行号+1>

2.不知道一共有多少行的情况

head -10 test | tail -8

即:

head -<结束行号> file | tail -<结束行号-初始行号+1>

2019 年 09 月 27 日

第 4 章 更多的 bash shell 命令

4.1 检测程序

4.1.1 探查进程

ps 命令只会显示运行在当前控制台下的属于当前用户的进程。

Linux 系统中使用 GNU ps 命令支持 3 中不同类型的命令行参数:

  • Unix 风格的参数,前面加单破折线;
  • BSD 风格的参数,前面不加破折线
  • GNU 风格的长参数,前面加双破折线
1.Unix 风格的参数
参数 描述
-A 显示所有进程
-N 显示与指定参数不符的所有进程
-a 显示除控制进程(session leader)和无终端进程外的所有进程
-d 显示除控制进程外的所有进程
-e 显示所有进程
-C cmdlist 显示包含在 cmdlist 列表中的进程
-G grplist 显示组 ID 在 grplist 列表中的进程
-U userlist 显示属主的用户 ID 在 userlist 列表中的进程
-g grplist 显示会话或组 ID 在 grplist 列表中的进程
-p pdilist 显示 PDI 在 pdilist 列表中的进程
-s sessionlist 显示会话 ID 在 sessionlist 列表中的进程
-t ttylist 显示终端 ID 在 ttylist 列表中的进程
-u userlist 显示有效用户 ID 在 userlist 列表中的进程
-F 显示更多额外输出(相对-t 参数而言)
-O format 显示默认的输出列以及 format 列表指定的特定列
-M 显示进程的安全信息
-c 显示进程的额外调度器信息
-f 显示完整的格式输出
-j 显示任务信息
-l 显示长列表
-o format 仅显示由 format 指定的列
-y 不要显示进程标记(process flag,表明进程状态的标记)
-z 显示安全标签(security context)信息
-H 用层级格式来显示进程(树状,用来显示父进程)
-n namelist 定义了 WCHAN 列显示的值
-w 采用宽输出模式,不限宽度显示
-L 显示进程中的线程
-V 显示 ps 命令的版本号

session leader 的概念可参考《Unix 环境高级编程(第三版)》第九章内容。

grplist 在不同的 Linux 发行版中可能不尽相同,有的发行版中 grplist 代表会话 ID,有的发行版中 grplist 代表有效组 ID。

security context 也叫 security label,是 SELinux 采用的声明资源的一种机制。

使用 ps 命令的关键在于记住最有用的那些参数。每个 Linux 系统管理员都应该有自己的一组参数,要牢牢记住。

如果想查看系统上运行的所有进程,可用 -ef 参数组合(ps 命令允许将多个参数组合在一起)

$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 11:29 ? 00:00:01 init [5]
root 2 0 0 11:29 ? 00:00:00 [kthreadd]
root 3 2 0 11:29 ? 00:00:00 [migration/0]
root 4 2 0 11:29 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 11:29 ? 00:00:00 [watchdog/0]
root 6 2 0 11:29 ? 00:00:00 [events/0]
root 7 2 0 11:29 ? 00:00:00 [khelper]
root 47 2 0 11:29 ? 00:00:00 [kblockd/0]
root 48 2 0 11:29 ? 00:00:00 [kacpid]
68 2349 1 0 11:30 ? 00:00:00 hald
root 3078 1981 0 12:00 ? 00:00:00 sshd: rich [priv]
rich 3080 3078 0 12:00 ? 00:00:00 sshd: rich@pts/0
rich 3081 3080 0 12:00 pts/0 00:00:00 -bash
rich 4445 3081 3 13:48 pts/0 00:00:00 ps -ef 

参数解释:

  • -e:指定显示所有运行在系统上的进程;
  • -f:扩展了输出,这些扩展的列包含了有用的进程:
  • UID:启动这些进程的用户
  • PID:进程的进程 ID
  • PPID:父进程的进程号(如果该进程是由另一个进程启动的)
  • C:进程声明周期中的 CPU 利用率
  • STIME:进程启动时的系统时间
  • TTY:进程启动时的终端设备
  • TIME:运行进程需要的累计 CPU 时间
  • CMD:启动的程序名称

若想获得更多的信息,可采用 -l 参数,它会残生一个长格式输出

$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 500 3081 3080 0 80 0 - 1173 wait pts/0 00:00:00 bash
0 R 500 4463 3081 1 80 0 - 1116 - pts/0 00:00:00 ps 

多出的参数:

  • F:内核分配给进程的系统标记。
  • S:进程的状态(O 代表正在运行;S 代表在休眠;R 代表可运行,正等待运行;Z 代表僵
    化,进程已结束但父进程已不存在;T 代表停止)。
  • PRI:进程的优先级(越大的数字代表越低的优先级)。
  • NI:谦让度值用来参与决定优先级。
  • ADDR:进程的内存地址。
  • SZ:假如进程被换出,所需交换空间的大致大小。
  • WCHAN:进程休眠的内核函数的地址。
2. BSD 风格的参数
参 数 描 述
T 显示跟当前终端关联的所有进程
a 显示跟任意终端关联的所有进程
g 显示所有的进程,包括控制进程
r 仅显示运行中的进程
x 显示所有的进程,甚至包括未分配任何终端的进程
U userlist 显示归 userlist 列表中某用户 ID 所有的进程
p pidlist 显示 PID 在 pidlist 列表中的进程
t ttylist 显示所关联的终端在 ttylist 列表中的进程
O format 除了默认输出的列之外,还输出由 format 指定的列
X 按过去的 Linux i386 寄存器格式显示
Z 将安全信息添加到输出中
j 显示任务信息
l 采用长模式
o format 仅显示由 format 指定的列
s 采用信号格式显示
u 采用基于用户的格式显示
v 采用虚拟内存格式显示
N namelist 定义在 WCHAN 列中使用的值
O order 定义显示信息列的顺序
S 将数值信息从子进程加到父进程上,比如 CPU 和内存的使用情况
c 显示真实的命令名称(用以启动进程的程序名称)
e 显示命令使用的环境变量
f 用分层格式来显示进程,表明哪些进程启动了哪些进程
h 不显示头信息
k sort 指定用以将输出排序的列
n 和 WCHAN 信息一起显示出来,用数值来表示用户 ID 和组 ID
w 为较宽屏幕显示宽输出
H 将线程按进程来显示
m 在进程后显示线程
L 列出所有格式指定符
V 显示 ps 命令的版本号

在使用 BSD 参数时,ps 命令会自动改变输出以模仿 BSD 格式。下例是使用 l 参数的输出:

$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 3081 3080 20 0 4692 1432 wait Ss pts/0 0:00 -bash
0 500 5104 3081 20 0 4468 844 - R+ pts/0 0:00 ps l 

注意,其中大部分的输出列跟使用 Unix 风格参数时的输出是一样的,只有一小部分不同。

  • VSZ:进程在内存中的大小,以千字节(KB)为单位。

  • RSS:进程在未换出时占用的物理内存。

  • STAT:代表当前进程状态的双字符状态码。
    许多系统管理员都喜欢 BSD 风格的 l 参数。它能输出更详细的进程状态码(STAT 列)。双字
    符状态码能比 Unix 风格输出的单字符状态码更清楚地表示进程的当前状态。
    第一个字符采用了和 Unix 风格 S 列相同的值,表明进程是在休眠、运行还是等待。第二个参
    数进一步说明进程的状态。

  • <:该进程运行在高优先级上。

  • N:该进程运行在低优先级上。

  • L:该进程有页面锁定在内存中。

  • s:该进程是控制进程。

  • l:该进程是多线程的。

  • +:该进程运行在前台。

从前面的例子可以看出,bash 命令处于休眠状态,但同时它也是一个控制进程(在我的会
话中,它是主要进程),而 ps 命令则运行在系统的前台。

3. GNU 长参数
参 数 描 述
--deselect 显示所有进程,命令行中列出的进程
--Group grplist 显示组 ID 在 grplist 列表中的进程
--User userlist 显示用户 ID 在 userlist 列表中的进程
--group grplist 显示有效组 ID 在 grplist 列表中的进程
--pid pidlist 显示 PID 在 pidlist 列表中的进程
--ppid pidlist 显示父 PID 在 pidlist 列表中的进程
--sid sidlist 显示会话 ID 在 sidlist 列表中的进程
--tty ttylist 显示终端设备号在 ttylist 列表中的进程
--user userlist 显示有效用户 ID 在 userlist 列表中的进程
--format format 仅显示由 format 指定的列
--context 显示额外的安全信息
--cols n 将屏幕宽度设置为 n 列
--columns n 将屏幕宽度设置为 n 列
--cumulative 包含已停止的子进程的信息
--forest 用层级结构显示出进程和父进程之间的关系
--headers 在每页输出中都显示列的头
--no-headers 不显示列的头
--lines n 将屏幕高度设为 n 行
--rows n 将屏幕高度设为 n 排
--sort order 指定将输出按哪列排序
--width n 将屏幕宽度设为 n 列
--help 显示帮助信息
--info 显示调试信息
--version 显示 ps 命令的版本号

可以将 GNU 长参数和 Unix 或 BSD 风格的参数混用来定制输出。GNU 长参数中一个着实让人
喜爱的功能就是--forest 参数。它会显示进程的层级信息,并用 ASCII 字符绘出可爱的图表。

1981 ? 00:00:00 sshd
3078 ? 00:00:00 \_ sshd
3080 ? 00:00:00 \_ sshd
3081 pts/0 00:00:00 \_ bash
16676 pts/0 00:00:00 \_ ps 

4.1.2 实时监测进程

top

image.png

参数解释:

  • PID:进程的 ID。
  • USER:进程属主的名字。
  • PR:进程的优先级。
  • NI:进程的谦让度值。
  • VIRT:进程占用的虚拟内存总量。
  • RES:进程占用的物理内存总量。
  • SHR:进程和其他进程共享的内存总量。
  • S:进程的状态(D 代表可中断的休眠状态,R 代表在运行状态,S 代表休眠状态,T 代表
    跟踪状态或停止状态,Z 代表僵化状态)。
  • %CPU:进程使用的 CPU 时间比例。
  • %MEM:进程使用的内存占可用内存的比例。
  • TIME+:自进程启动到目前为止的 CPU 时间总量。
  • COMMAND:进程所对应的命令行名称,也就是启动的程序名。

4.1.3 结束进程

进程信号

信 号 名 称 描 述
1 HUP 挂起
2 INT 中断
3 QUIT 结束运行
9 KILL 无条件终止
11 SEGV 段错误
15 TERM 尽可能终止
17 STOP 无条件停止运行,但不终止
18 TSTP 停止或暂停,但继续在后台运行
19 CONT 在 STOP 或 TSTP 之后恢复执行
1. kill 命令

只能用进程的 PID 而不能用命令名
要发送进程信号,你必须是进程的属主或登录为 root 用户。

$ kill 3940
-bash: kill: (3940) - Operation not permitted

如果有不服管教的进程,那它通常会忽略这个请求。如果要强制终止,-s 参数支持指定其他信号(用信号名或信号值)。
你能从下例中看出,kill 命令不会有任何输出。

# kill -s HUP 3940 

要检查 kill 命令是否有效,可再运行 ps 或 top 命令,看看问题进程是否已停止。

2. killall 命令

支持通过进程名而不是 PID 来结束进程。killall 命令也支持通
配符,这在系统因负载过大而变得很慢时很有用。

注意,使用这个命令需要安装 psmisc

# killall http*

警告: 以 root 用户身份登录系统时,使用 killall 命令要特别小心,因为很容易就会误用通配符
而结束了重要的系统进程。这可能会破坏文件系统。

2019 年 10 月 10 日

4.2 检测磁盘空间

4.2.1 挂载存储媒体

1.mount 命令

默认情况下,mount 会输出当前系统上挂载的设备列表

$ mount
/dev/mapper/VolGroup00-LogVol00 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/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) /dev/sdb1 on /media/disk type vfat (rw,nosuid,nodev,uhelper=hal,shortname=lower,uid=503)

mount 命令提供如下四部分信息:

  • 媒体的设备文件名
  • 媒体挂载到虚拟目录的挂载点
  • 文件系统类型
  • 已挂载媒体的访问状态

上面例子的最后一行输出中,U 盘被 GNOME 桌面自动挂载到了挂载点/media/disk。vfat 文件
系统类型说明它是在 Windows 机器上被格式化的。

手动在虚拟目录中挂载设备,需要以 root 身份执行

mount -t type device directory

type 参数指定了磁盘被格式化的文件系统类型

文件类型如下:

  • vfat:Windows 长文件系统。
  • ntfs:Windows NT、XP、Vista 以及 Windows 7 中广泛使用的高级文件系统。
  • iso9660:标准 CD-ROM 文件系统。

手动将 U 盘/dev/sdb1 挂载到/media/disk

mount -t vfat /dev/sdb1 /media/disk

mount 命令的参数如下:

参数 描述
-a 挂载/etc/fstab 文件中指定的所有文件系统
-f 使 mount 命令模拟挂载设备,但并不真的挂载
-F 和-a 参数一起使用时,会同时挂载所有文件系统
-v 详细模式,将会说明挂载设备的每一步
-I 不启用任何/sbin/mount.filesystem 下的文件系统帮助文件
-l 给 ext2、ext3 或 XFS 文件系统自动添加文件系统标签
-n 挂载设备,但不注册到/etc/mtab 已挂载设备文件中
-p num 进行加密挂载时,从文件描述符 num 中获得密码短语
-s 忽略该文件系统不支持的挂载选项
-r 将设备挂载为只读的
-w 将设备挂载为可读写的(默认参数)
-L label 将设备按指定的 label 挂载
-U uuid 将设备按指定的 uuid 挂载
-O 和-a 参数一起使用,限制命令只作用到特定的一组文件系统上
-o 给文件系统添加特定的选项

-o 参数允许在挂载文件系统时添加一些以逗号分隔的额外选项。以下为常用的选项。

  • ro:以只读形式挂载。
  • rw:以读写形式挂载。
  • user:允许普通用户挂载文件系统。
  • check=none:挂载文件系统时不进行完整性校验。
  • loop:挂载一个文件。
2.umount 命令

Linux 上不能直接弹出已挂载的 CD。如果你在从光驱中移除 CD 时遇到麻烦,通常是因为 该 CD 还挂载在虚拟目录里。先卸载它,然后再去尝试弹出。

umount [directory | device ]

卸载一个设备之前确保该设备中没有文件正在被使用,否则卸载失败

[root@testbox mnt]# umount /home/rich/mnt
umount: /home/rich/mnt: device is busy
umount: /home/rich/mnt: device is busy 12 [root@testbox mnt]# cd /home/rich
[root@testbox rich]# umount /home/rich/mnt
[root@testbox rich]# ls -l mnt
total 0

如果在卸载设备时,系统提示设备繁忙,无法卸载设备,通常是有进程还在访问该设备或使用该设备上的文件。 这时可用 lsof 命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。lsof 命令的用法很简 单:lsof /path/to/device/node,或者 lsof /path/to/mount/point。

4.2.2 使用 df 命令

$ df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda2             18251068   7703964   9605024  45% /
/dev/sda1               101086     18680     77187  20% /boot
tmpfs                   119536         0    119536   0% /dev/shm
/dev/sdb1               127462    113892     13570  90% /media/disk

命令输出如下:

  • 设备的设备文件位置;
  • 能容纳多少个 1024 字节大小的块;
  • 已用了多少个 1024 字节大小的块;
  • 还有多少个 1024 字节大小的块可用;
  • 已用空间所占的比例;
  • 设备挂载到了哪个挂载点上。

输出中 的磁盘空间按照用户易读的形式显示

$ df -h
文件系统        容量    已用  可用  已用% 挂载点
udev           927M     0  927M    0% /dev
tmpfs          190M  1.3M  189M    1% /run
/dev/sda2      117G   11G  100G   10% /
tmpfs          949M     0  949M    0% /dev/shm
tmpfs          5.0M  4.0K  5.0M    1% /run/lock
tmpfs          949M     0  949M    0% /sys/fs/cgroup
/dev/sda1      511M  6.1M  505M    2% /boot/efi
tmpfs          190M  4.0K  190M    1% /run/user/1000

说明:Linux 系统后台一直有进程来处理文件或使用文件。df 命令的输出值显示的是 Linux 系统认 为的当前值。有可能系统上有运行的进程已经创建或删除了某个文件,但尚未释放文件。 这个值是不会算进闲置空间的

4.2.3 使用 du 命令

$ du
484     ./.gstreamer-0.10
8       ./Templates
8       ./Download
8       ./.ccache/7/0
24      ./.ccache/7
368     ./.ccache/a/d
384     ./.ccache/a
424     ./.ccache
8       ./Public
8       ./.gphpedit/plugins
32      ./.gphpedit
72      ./.gconfd
128     ./.nautilus/metafiles
384     ./.nautilus
72      ./.bittorrent/data/metainfo
20      ./.bittorrent/data/resume
144     ./.bittorrent/data
152     ./.bittorrent
8       ./Videos 9 8 ./Music
16      ./.config/gtk-2.0
40      ./.config
8       ./Documents

注意,这个列表是从目录层级的最 底部开始,然后按文件、子目录、目录逐级向上。

下面是能让 du 命令用起来更方便的几个命令行参数。

  • -c:显示所有已列出文件总的大小。
  • -h:按用户易读的格式输出大小,即用 K 替代千字节,用 M 替代兆字节,用 G 替代吉字节。(输出每个文件夹的大小和总占用)
  • -s:显示每个输出参数的总计。

image.png

image.png

image.png

4.3 处理数据文件

4.3.1 排序数据

按照字母顺序将文件从大到小输出

$ du -sh * | sort -nr
1008k   mrtg-2.9.29.tar.gz
972k    bldg1
888k    fbs2.pdf
760k    Printtest
680k    rsync-2.6.6.tar.gz
660k    code
516k    fig1001.tiff
496k    test
496k    php-common-4.0.4pl1-6mdk.i586.rpm
448k    MesaGLUT-6.5.1.tar.gz
400k    plp

注意,-r 参数将结果按降序输出,这样就更容易看到目录下的哪些文件占用空间最多。

4.3.2 搜索数据

grep:在某个文件中查找某个内容

grep [options] pattern [file]
$ grep three file1
three
$ grep t file1
two
three

反向搜索(输出不匹配该模式的行),可加-v 参数

$ grep -v t file1
one
four
five

显示匹配模式的行所在的行号,可加-n 参数

$ grep -n t file1
2:two
3:three

知道有多少行含有匹配的模式,可用-c 参数

$ grep -c t file1
2

指定多个匹配模式,可用-e 参数来指定每个模式

$ grep -e t -e f file1
two
three
four
five

使用正则表达式

$ grep [tf] file1
two
three
four
five

egrep 命令是 grep 的一个衍生,支持 POSIX 扩展正则表达式。POSIX 扩展正则表达式含有更 多的可以用来指定匹配模式的字符(参见第 20 章)。fgrep 则是另外一个版本,支持将匹配模式 指定为用换行符分隔的一列固定长度的字符串。这样就可以把这列字符串放到一个文件中,然后 在 fgrep 命令中用其在一个大型文件中搜索字符串了。

4.3.3 压缩数据

Linux 上的文件压缩工具

工具 文件扩展名 描述
bzip2 .bz2 采用 Burrows-Wheeler 块排序文本压缩算法和霍夫曼编码
compress .Z 最初的 Unix 文件压缩工具,已经快没人用了
gzip .gz GNU 压缩工具,用 Lempel-Ziv 编码
zip .zip Windows 上 PKZIP 工具的 Unix 实现

gzip 工具

  • gzip:用来压缩文件。
  • gzcat:用来查看压缩过的文本文件的内容。
  • gunzip:用来解压文件。

这些工具基本上跟 bzip2 工具的用法一样。

$ gzip myprog
$ ls -l my*
-rwxrwxr-x 1 rich rich 2197 2007-09-13 11:29 myprog.gz

使用通配符

$ gzip my*

4.3.4 归档数据

下面是 tar 命令的格式:

tar function [options] object1 object2 ...
功能 长名称 描述
-A --concatenate 将一个已有 tar 归档文件追加到另一个已有 tar 归档文件
-c --create 创建一个新的 tar 归档文件
-d --diff 检查归档文件和文件系统的不同之处
--delete 从已有 tar 归档文件中删除
-r --append 追加文件到已有 tar 归档文件末尾
-t --list 列出已有 tar 归档文件的内容
-u --update 将比 tar 归档文件中已有的同名文件新的文件追加到该 tar 归档文件中
-x --extract 从已有 tar 归档文件中提取文件
选项 描述
-C dir 切换到指定目录
-f file 输出结果到文件或设备 file
-j 将输出重定向给 bzip2 命令来压缩内容
-p 保留所有文件权限
-v 在处理文件时显示文件
-z 将输出重定向给 gzip 命令来压缩内容
tar -cvf test.tar test/ test2/

上面的命令创建了名为 test.tar 的归档文件,含有 test 和 test2 目录内容。接着,用下列命令:

tar -tf test.tar

列出 tar 文件 test.tar 的内容(但并不提取文件)。最后,用命令:

tar -xvf test.tar

窍门: 下载了开源软件之后,你会经常看到文件名以.tgz 结尾。这些是 gzip 压缩过的 tar 文件可以 用命令 tar -zxvf filename.tgz 来解压。

补充:
打包

tar czvf xx.tar xx
zip -r xx.zip xx

解压到当前目录

tar xzvf xx.tar
unzip xx.zip

解压到指定目录

tar xzvf xx.tar -C <dir>
unzip zz.zip -d <dir>
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    123 引用 • 74 回帖 • 2 关注
  • 阅读
    85 引用 • 242 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...