Linux命令行与Shell脚本编程
第四章 更多命令
进程管理
磁盘统计信息
挂载新磁盘
数据排序
数据归档
文章目录
- Linux命令行与Shell脚本编程
- 四,更多命令
- 4.1,监测程序
- 4.1.1,ps 探查进程
- 4.1.2,top 实时监测进程
- 4.1.3,kill pkill 结束进程
- 1,kill 命令
- 2,pkill 命令
- 4.2,检测磁盘空间
- 4.2.1,mount umount挂载存储设备
- 1. mount 命令
- 2,umount 命令
- 4.2.2, df 命令
- 4.2.3, du 命令
- 4.3,处理数据文件
- 4.3.1,sort 数据排序
- 4.3.2,grep 数据搜索
- 4.3.3,gzip等 数据压缩
- 4.3.4,tar 数据归档
四,更多命令
进程管理
磁盘统计信息
挂载新磁盘
数据排序
数据归档
4.1,监测程序
跟踪运行在系统中的程序
4.1.1,ps 探查进程
程序在系统运行时,被称为进程.
ps 命令能够输出系统中运行程序的大量信息.
默认情况下,ps命令只显示运行在当前终端中属于当前用户的那些进程。基本输出显示了
程序的进程ID(process ID,PID)、
进程运行在哪个终端 (TTY)及其占用的CPU时间。
$ ps
PID TTY TIME CMD
3081 pts/0 00:00:00 bash
3209 pts/0 00:00:00 ps
例子中,只有 bash shell在运行(记住,shell只是运行在系统中的另一个程序),当然ps命令本身也在运行。
Linux系统中使用的GNU ps命令支持3种类型的命令行选项:
·Unix风格选项,选项前加单连字符;
·BSD风格选项,选项前不加连字符;
·GNU长选项,选项前加双连字符。
1.Unix风格选项
ps -ef 查看系统中所有进程.
$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 3 07:30 ? 00:13:42 java -Dtomcat.monitor.http.binding.host=127.0.0.1 -Dhsf.publish.default.tid=false -Dhsf.subscribe.default.tid=false -Dproject.
root 781 0 0 14:03 ? 00:00:00 /bin/sh -i -c /bin/bash || clear;/bin/sh
root 782 781 0 14:03 ? 00:00:00 /bin/bash
root 841 832 0 14:29 ? 00:00:00 ps -ef
UID:启动该进程的用户。
PID:进程ID。
PPID:父进程的PID(如果该进程是由另一个进程启动的)。
C:进程生命期中的CPU利用率。
STIME:进程启动时的系统时间。
TTY:进程是从哪个终端设备启动的。
TIME:运行进程的累计CPU时间。
CMD:启动的程序名称。
-l 更多信息
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 831 0 0 80 0 - 3782 do_wai ? 00:00:00 sh
0 S 0 832 831 0 80 0 - 3818 do_wai ? 00:00:00 bash
0 R 0 885 832 0 80 0 - 13267 - ? 00:00:00 ps
F:内核分配给进程的系统标志。
S:进程的状态(O代表正在运行;S代表在休眠;R代表可运行,正等待运行;Z代表僵化,已终止但找不到其父进程;T代表停止)。
PRI:进程的优先级(数字越大,优先级越低)。
NI:谦让度(nice),用于决定优先级。
ADDR:进程的内存地址。
SZ:进程被换出时所需交换空间的大致大小。
WCHAN:进程休眠的内核函数地址。
2.BSD风格
伯克利软件发行版(Berkeley Software Distribution,BSD)是加州大学伯克利分校开发的一个Unix版本。
ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 781 0 20 0 15128 2820 do_wai Ss ? 0:00 /bin/sh -i -c /bin/bash || clear;/bin/sh
0 0 782 781 20 0 15272 3208 - S+ ? 0:00 /bin/bash
0 0 962 832 20 0 53068 3860 - R+ ? 0:00 ps l
VSZ:进程占用的虚拟内存大小(以KB为单位)。
RSS:进程在未被交换出时占用的物理内存大小。
STAT:代表当前进程状态的多字符状态码。
第一个字符采用了与Unix风格的S输出列相同的值,表明进程是在休眠、运行还是等待。第二个字符进一步说明了进程的状态。
<:该进程以高优先级运行。
N:该进程以低优先级运行。
L:该进程有锁定在内存中的页面。
s:该进程是控制进程。
1:该进程拥有多线程。
+:该进程在前台运行。
3.GNU长选项
GNU开发人员在经过改进的新 ps命令中加入了另外一些选项,其中一些GNU长选项复制了现有的Unix或BSD风格选项的效果,而另外一些则提供了新功能。
GNU长选项。
可以混用 GNU长选项和 Unix或 BSD风格的选项来定制输出。作为一个GNU长选项,
--forest 选项能够使用 ASCII字符来绘制可爱的图表以显示进程的层级信息:
PID TTY TIME CMD
831 ? 00:00:00 sh
832 ? 00:00:00 \_ bash
963 ? 00:00:00 \_ ps
这种格式可以轻而易举地跟踪子进程和父进程。
4.1.2,top 实时监测进程
ps 只能显示某个特定时间点的信息.
top 命令可以实时显示进程信息.
top 输出
top - 14:44:17 up 7:13, 0 users, load average: 0.13, 0.13, 0.09
Tasks: 8 total, 1 running, 7 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.0 us, 0.7 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2080904 total, 624940 free, 1016068 used, 439896 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 972604 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 3662444 842812 23004 S 3.0 40.5 14:18.49 java
781 root 20 0 15128 2820 2636 S 0.0 0.1 0:00.00 sh
782 root 20 0 15272 3208 2880 S 0.0 0.2 0:00.00 bash
...
输出的第一部分显示的是系统概况:
第一行显示了当前时间、系统的运行时长、登录的用户数以及系统的平均负载。
平均负载有3个值,分别是最近1分钟、最近5分钟和最近15分钟的平均负载。
值越大说明系统的负载越高。由于进程短期的突发性活动,出现最近1分钟的高负载值也很常见。
但如果近15分钟内的平均负载都很高,就说明系统可能有问题了。
第二行显示了进程(top称其为task)概况:
多少进程处于运行、休眠、停止以及僵化状态(僵化状态指进程已结束,但其父进程没有响应)。
第三行显示了CPU概况。
top会根据进程的属主(用户或是系统)和进程的状态(运行、空闲或等待)将CPU利用率分成几类输出。
第四,五行详细说明了系统内存的状态。
第四行:显示了系统的物理内存状态:总共有多少内存、当前用了多少,以及还有多少空闲。
第五行:显示了系统交换空间(如果分配了的话)的状态。
后一部分显示了当前处于运行状态的进程的详细列表,有些列跟ps命令的输出类似。
PID:进程的PID。
USER:进程属主的用户名。
PR:进程的优先级。
NI:进程的谦让度。
VIRT:进程占用的虚拟内存总量。
RES:进程占用的物理内存总量。
SHR:进程和其他进程共享的内存总量。
S:进程的状态(D代表可中断的休眠,R代表运行,S代表休眠,T代表被跟踪或停止,Z代表僵化)。
%CPU:进程使用的CPU时间比例。
%MEM:进程使用的可用物理内存比例。
TIME+:自进程启动到目前为止所占用的CPU时间总量。
COMMAND:进程所对应的命令行名称,也就是启动的程序名。
默认情况,top命令在启动时会按照 %CPU 值来对进程进行排序,你可以在top命令运行时使用多种交互式命令来重新排序。
top的行为:
键入f允许你选择用于对输出进行排序的字段,
键入d允许你修改轮询间隔(pollinginterval),
键入q可以退出top。
4.1.3,kill pkill 结束进程
在Linux中,进程之间通过信号来通信。进程的信号是预定义好的一个消息,进程能识别该消息并决定忽略还是做出反应。
大多数编写完善的应用程序能接收和处理标准Unix进程信号。
在Linux中有两个命令可以向运行中的进程发出进程信号 :kill 和 pkill。
1,kill 命令
kill 命令 通过 PID 进程id 发送信号.默认 kill会向命令行列出的所有 进程发送 TERM 信号.(只能通过PID,不能通过进程名)
发送进程信号,必须是进程的属主或root用户.
$ kill 3940
-bash: kill: (3940) - Operation not permitted
-s
TERM信号会告诉进程终止运行。'不服管教'的进程通常会忽略这个请求。如果要强制终止,则-s选项支持指定其他信号(用信号名或信号值)。
kill命令不会有任何输出:
# kill -s HUP 3940
只能运行 ps 或 top 命令查看进程是否已停止运行.
2,pkill 命令
pkill命令可以使用程序名来终止进程。pkill命令也允许使用通配符:
#pkill http*
该命令将"杀死"所有名称以http起始的进程,比如 ApahceWebServer的httpd服务。
!!! 以root身份使用pkill命令时要格外小心。命令中的通配符很容易意外地将系统的重要进程终止。这可能会导致文件系统损坏。
4.2,检测磁盘空间
4.2.1,mount umount挂载存储设备
挂载(mounting): Linux文件系统会将所有的磁盘都并入单个虚拟目录。在使用新的存储设备之前,需要将其放在虚拟目录中。
图形化桌面环境中,大多数 Linux 发行版能自动挂载特定类型的可移动存储设备。
1. mount 命令
mount 命令 用于挂载存储设备的。
mount命令提供了4部分信息。
设备文件名
设备在虚拟目录中的挂载点
文件系统类型
已挂载设备的访问状态
在默认情况下,mount命令会输出当前系统已挂载的设备列表。
除了标准存储设备,较新版本的内核还会挂载大量用作 管理目的 的虚拟文件系统。
若知道设备分区 使用的文件系统类型 ,可以使用 -t 过滤
$ mount -t ext4
/dev/vda on /home/admin/.tools type ext4 (rw,relatime,nobarrier)
/dev/vda on /home/admin/.opt type ext4 (rw,relatime,nobarrier)
设备文件名 on 设备在虚拟目录中的挂载点 type 文件系统类型 (已挂载设备的访问状态)
手动在虚拟目录中挂载设备,需要以root用户身份登录,或是以root用户身份运行sudo命令。
手动挂载设备的基本命令:
mount -t type device directory
type参数 指定磁盘格式化所使用的文件系统类型。Linux可以识别多种文件系统类型。如果与 WindowsPC 共用移动存储设备,那么通常需要使用下列文件系统类型。
vfat: WindowsFAT32文件系统,支持长文件名。
ntfs: WindowsNT及后续操作系统中广泛使用的高级文件系统。
exfat: 专门为可移动存储设备优化的Windows文件系统。
iso9660: 标准CD-ROM和DVD文件系统。
device 指定了该存储设备的设备文件位置
directory 指定挂载点在虚拟目录中的位置。
例如,手动将U盘/dev/sdb1挂载到/media/disk,可以使用下列命令:
mount -t vfat /dev/sdb1 /media/disk
一旦存储设备被挂载到虚拟目录,root用户就拥有了对该设备的所有访问权限,而其他用户的访问则会被限制。
可以通过目录权限指定用户对设备的访问权限。
其他选项
-o选项允许在挂载文件系统时 添加一系列以逗号分隔的额外选项。常用选项:
ro:以只读形式挂载。
rw:以读写形式挂载。
user:允许普通用户挂载该文件系统。
check=none:挂载文件系统时不执行完整性校验。
loop:挂载文件。
2,umount 命令
umount 卸载设备的命令
umount [directory | device ]
移除可移动设备时,不能直接将设备拔下,应该先卸载。
Linux不允许直接弹出已挂载的CD或DVD。
如果在从光驱中移除CD或DVD时遇到麻烦,可能是还在虚拟目录中挂载着。应该先卸载,然后再尝试弹出。
umount命令支持通过设备文件或者挂载点来指定要卸载的设备。如果有任何程序正在使用设备上的文件,则系统将不允许卸载该设备。
# umount /home/rich/mnt
umount: /home/rich/mnt: device is busy
umount: /home/rich/mnt: device is busy
#cd/home/rich
# umount /home/rich/mnt
当 命令行提示符 位于已挂载设备的文件系统中时, umount命令无法卸载该镜像文件。一旦命令提示符移出其镜像文件系统,umount命令就能成功卸载镜像文件了。
如果在卸载设备时,系统提示设备繁忙,无法卸载,那么通常是有进程还在访问该设备或使用该设备上的文件。
可用 lsof 命令获得相关进程的信息,然后将进程终止。
lsof 命令:
lsof/path/to/device/node,或者 lsof/path/to/mount/point.
4.2.2, df 命令
df命令可以方便地查看所有已挂载磁盘的磁盘的使用情况:(当前值)
df命令会输出内核挂载的所有虚拟文件系统,因此可以使用-t选项来指定文件系统类型,进而过滤输出结果。
$ df -t ext4 -t vfat
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 19475088 7326256 11136508 40% /
/dev/sda2 524272 4 524268 1% /boot/efi
输出结果
设备文件位置
包含多少以1024字节为单位的块
使用了多少以1024字节为单位的块
还有多少以1024字节为单位的块可用
已用空间所占的百分比
设备挂载点
-h (human-readable),以人类易读的方式显示 M兆,G吉
$ df -h
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda5 19G 7.0G 11G 40% /
/dev/sda2 512M 4.0K 512M 1% /boot/efi
4.2.3, du 命令
通过df命令,很容易发现哪个磁盘存储空间不足。
du命令可以显示某个特定目录(默认下是当前目录)的磁盘使用情况。这有助于你快速判断系统中是否存在磁盘占用"大户"。
在默认情况下,du命令会显示当前目录下所有的文件、目录和子目录的磁盘使用情况,并以磁盘块为单位来表明每个文件或目录占用了多大存储空间。
du命令的部分输出:
$ du
484 /.gstreamer-0.10
8 /Templates
8 ./Download
... ...
左侧数字表示文件或目录所占的磁盘块数.
目录层级的底部向上逐渐输出,
选项
-c:显示所有已列出文件的总大小。
-h:按人类易读格式输出大小,分别用K表示千字节、M表示兆字节、G表示吉字节。
-s:输出每个参数的汇总信息。
4.3,处理数据文件
4.3.1,sort 数据排序
默认情况,sort命令会依据会话所指定的默认语言的排序规则来对文本文件中的数据行进行排序.
$ cat file1
one
two
three
$ sort file1
one
three
two
在默认情况下,sort命令会将数字视为字符并执行标准的字符排序,这种结果不是正常想要的。
-n 选项 : 将数字按值排序:
$ cat file2
2
100
1
$ sort file2
1
100
2
$sort -n file2
1
2
100
sort选项
短选项 | 长选项 | 描述 |
---|---|---|
-k | –key= POS1[POS2] | 排序键从POS1位置开始,到POS2位置结束(如果指定了POS2的话] |
-t | –field-separator= SEP | 指定字段分隔符 |
-n | –numeric-sort | 将字符串按数值意义排序 |
-r | –reverse | 逆序排序( 升序变成降序) |
-b | –ignore-leading-blanks | 排序时忽略起始的空白字符 |
-C | –check=quiet | 不排序,如果数据无序也不要报告 |
-c | –check | 不排序,但检查输入数据是否有序,无序的话就报告 |
-d | –dictionary-order | 仅考虑空白字符和字母数字字符,不考虑特殊字符 |
-f | –ignore-case | 大写字母默认先出现,该选项会忽略大小写 |
-g | –general-numeric-sort | 使用一般数值进行排序 |
-i | –ignore-nonprinting | 在排序时忽不可打印字符 |
-M | –month-sort | 用三字符的月份名按月份排序 |
-m | –merge | 合并两个已排序数据文件 |
-o | –output= file | 将排序结果写入指定文件 |
-R | –random-sort | 根据随机哈希排序 |
|--random-source= FILE |指定-R选项用到的随机字节文件
-S |–buffer-size= SIZE |指定使用的内存大小
-s |–stable |禁止last-resort比较,实现稳定排序
-T |–temporary-directory= DIR |指定用于保存临时工作文件的目录
-u |–unique |和-c选项合用时,检查严格排序;不和-c选项合用时,相同行仅输出一次2
-z |–unique |在行尾使用NULL字符代替换行符
在对按字段分隔的数据(比如/etc/passwd文件)进行排序时,-k选项和-t选项非常方便。
先使用-t选项指定字段分隔符,然后使用-k选项指定排序字段。例如,要根据用户ID对/etc/passwd按数值排序,可以这么做:
$ sort -t ':' -k 3 -n /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
-n选项适合于排序数值型输出,比如du命的输出:
$ du -sh *| sort -nr
1008k mrtg-2.9.29.tar.gz
972k bldg1
1888k fbs2.pdf
760k Printtest
680k rsync-2.6.6.tar.gz
-r 降序排列
4.3.2,grep 数据搜索
大文件中查找位于中间位置的数据
使用grep命令来帮助查找
grep [options] pattern [file]
grep命令会在 输入或指定文件 中逐行搜索匹配指定模式的文本。该命令的输出是 包含了匹配模式的行。
$ grep t file1
two
three
匹配模式可以使用UNIX模式的正则表达式
-v 反向搜索,输出不匹配的行
-n 匹配指定模式的那些行的行号
-c 输出有多少行含有匹配模式
-e 指定多个匹配模式
逐个指定:
$ grep -et -e f file1
two
three
four
five
egrep命令是grep的一个衍生,支持POSIX扩展正则表达式,其中包含更多可用于指定匹配模式的字符。
fgrep 支持将匹配模式指定为以换行符分隔的一系列固定长度的字符串。
4.3.3,gzip等 数据压缩
linux 文件压缩工具
工具 | 文件扩展名 | 描述 |
---|---|---|
bzip2 | .bz2 | 采用Burrows-Wheeler块排序交本压缩算法和霍夫曼编码 |
compress | .Z | 最初的Unix文件压缩工具,无人使用 |
gzip | .gz | GNU压缩工具,用 Lempel-Zivwelch 编码(linux最流行) |
xz | .xz | 日渐流行的通用压缩工具 |
zip | .zip | Windows中PKZIP工具的Unix实现 |
linux最流行 gzip
gzip:压缩文件
gzcat:查看压缩文件的内容
gunzip:解压文件
gzip命令会压缩命令行中指定的文件。可以指定多个文件名或是用通配符来一次性压缩多个文件:
$ gzip my*
4.3.4,tar 数据归档
Unix,Linux 中最流行的归档工具是 tar 命令.
tar 命令最开始是用于 将文件写入磁带设备 以作归档,也可以 将输出写入文件,是在Linux中归档数据的普遍做法。
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归档文件中 已有的同名文件更新的文件 追击到该归档文件
-x |–extract |从tar归档文件中提取文件
选项 | 描述 |
---|---|
-C dir | 切换到指定目录 |
-f file | 将结果输出到文件(或设备) |
-p | 保留文件的所有权利 |
-v | 在处理文件时显示文件名 |
-j | 将输出传给bzip2命令进行压缩 |
-J | 将输出传给xz命令进行压缩 |
-z | 将输出传给gzip命令进行压缩 |
-Z | 将输出传给compress命令进行压缩 |
常用:
创建归档文件:创建一个名为test.tar的归档文件,包含目录test和test2的内容。
tar -cvf test.tar test/ test2/
列出了(但不提取)tar文件test.tar的内容。
tar -tf test.tar
从tar文件test.tar中提取内容。如果 tar文件含有目录结构,则在当前目录中重建该目录的整个结构。
tar -xvf test.tar
在下载开源软件时经常会看到文件名以.tgz结尾,这是经 gzip压缩过的tar文件,提取其中的内容:
tar -zxvf filename.tgz