本博客内容来自《Linux命令行与shell脚本编程大全》第四章
目录
1、监测程序
探查进程
ps命令用于显示当前进程 (process) 的状态
ps支持三种不同类型的命令行参数
-
Unix风格
继承自贝尔实验室原有ps命令,前面加单破折号,-A 与-e 参数都是显示所有进程
[root@izwz9194nuv8g0cwqfqsh3z ~]# ps -A
PID TTY TIME CMD
1 ? 00:00:01 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:01 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
6 ? 00:00:00 kworker/u2:0
......
-f 参数显示完整格式的输出,一般常用ps -ef
[root@izwz9194nuv8g0cwqfqsh3z ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Feb20 ? 00:00:01 /usr/lib/systemd/systemd ...
root 2 0 0 Feb20 ? 00:00:00 [kthreadd]
root 3 2 0 Feb20 ? 00:00:01 [ksoftirqd/0]
root 5 2 0 Feb20 ? 00:00:00 [kworker/0:0H]
root 6 2 0 Feb20 ? 00:00:00 [kworker/u2:0]
root 7 2 0 Feb20 ? 00:00:00 [migration/0]
root 8 2 0 Feb20 ? 00:00:00 [rcu_bh]
root 9 2 0 Feb20 ? 00:00:06 [rcu_sched]
root 10 2 0 Feb20 ? 00:00:00 [watchdog/0]
......信息包括:
UID:启动进程的用户
PID:进程的进程ID
PPID:进程的父进程号
C:进程生命周期中的CPU使用率
STIME:进程启动时的系统时间
TTY:进程启动时的终端设备
TIME:运行进程需要的累计CPU时间
CMD:启动的程序名称
如果想显示更多信息,可增加 -l 参数,会输出长格式信息
[root@izwz9194nuv8g0cwqfqsh3z ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 10791 ep_pol Feb20 ? 00:00:01 /usr/lib/systemd/systemd ...
1 S root 2 0 0 80 0 - 0 kthrea Feb20 ? 00:00:00 [kthreadd]
1 S root 3 2 0 80 0 - 0 smpboo Feb20 ? 00:00:01 [ksoftirqd/0]
1 S root 5 2 0 60 -20 - 0 worker Feb20 ? 00:00:00 [kworker/0:0H]
1 S root 6 2 0 80 0 - 0 worker Feb20 ? 00:00:00 [kworker/u2:0]
1 S root 7 2 0 -40 - - 0 smpboo Feb20 ? 00:00:00 [migration/0]
1 S root 8 2 0 80 0 - 0 rcu_gp Feb20 ? 00:00:00 [rcu_bh]
1 R root 9 2 0 80 0 - 0 - Feb20 ? 00:00:06 [rcu_sched]
5 S root 10 2 0 -40 - - 0 smpboo Feb20 ? 00:00:00 [watchdog/0]
......增加信息:
F:内核分配给进程的系统标记
S:进程状态(O-在运行;S-休眠;R-等待运行;Z-僵化;T-停止)
PRI:进程优先级
NI:谦让度值,用来参与决定优先级
ADDR:进程的内存地址
SZ:假如进程被换出,所需交换空间的大致大小
WCHAN:进程休眠的内核函数的地址
-
BSD风格参数
来自加州伯克利大学的Unix版本,参数前不带破折号
系统管理员都喜欢BSD风格的l参数(long),能输出更详细的进程状态码(STAT列)——双字符状态码
[root@izwz9194nuv8g0cwqfqsh3z ~]# ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
4 0 489 1 20 0 110032 864 n_tty_ Ss+ ttyS0 0:00 /sbin/agetty --keep-baud ......
4 0 490 1 20 0 110032 848 n_tty_ Ss+ tty1 0:00 /sbin/agetty --noclear tty1 linux
4 0 3819 3817 20 0 115380 2036 wait Ss pts/0 0:00 -bash
0 0 3910 3819 20 0 148928 1464 - R+ pts/0 0:00 ps l
......STAT状态码:
第一个参数与Unix风格的S列相同
第二个参数:
<:该进程运行在高优先级上
N:该进程运行在低优先级上
L:该进程有页面锁定在内存中
s:该进程是控制进程
l:该进程是多线程的
+:该进程运行在前台
-
GNU长参数风格
来自GNU开发人员,带两个破折号
最常用的参数是 --forest,它会显示进程的层级信息,让跟踪子进程和父进程变得容易
[root@izwz9194nuv8g0cwqfqsh3z ~]# ps --forest
PID TTY TIME CMD
3819 pts/0 00:00:00 bash
3917 pts/0 00:00:00 \_ ps
实时监测进程
ps命令只能显示某个特定时间点的进程信息,需要用top命令
top - 14:35:40 up 1 day, 17 min, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 62 total, 1 running, 61 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1883724 total, 1527912 free, 86444 used, 269368 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1637740 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
812 root 20 0 32724 4148 2488 S 0.3 0.2 0:18.85 AliYunDunUpdate
1076 root 10 -10 125504 11220 8532 S 0.3 0.6 4:07.64 AliYunDun
1 root 20 0 43164 3544 2412 S 0.0 0.2 0:01.57 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:01.12 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H......
新增参数说明:
PR:进程优先级
VIRT:进程占用的虚拟内存总量
RES:进程占用的物理内存总量
SHR:进程和其他进程共享的内存总量
%CPU:进程使用的CPU时间比例(top默认按该值排序显示)
%MEM:进程使用的内存占可用内存的比例
TIME+:自启动到目前为止的CPU时间总量
第一行为系统概况:当前时间、系统运行时间、登录用户数、系统平均负载(最近1分钟、5分钟和15分钟)
第二行为进程概况;第三行为CPU概况;第四行为系统物理内存状态;第五行是针对系统交换空间的内存状态
最后为当前运行中的进程详细列表,与ps类似
常用-d参数改变轮询时间(默认3秒),输入以下命令每隔1s轮询
top -d 1
结束进程
-
kill命令
可将指定的信息送至程序。预设的信息为SIG TERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIG KILL(9)信息尝试强制删除程序。
杀死进程
# kill 12345
强制杀死进程
# kill -KILL 123456
发送SIGHUP信号,可以使用一下信号
# kill -HUP pid
彻底杀死进程
# kill -9 123456
-
killall命令
支持通过进程名而不是PID来结束进程,还支持通配符
#killall http*
结束所有以http开头的进程
2、监测磁盘空间
挂载存储媒体
-
mount命令
mount默认输出当前系统上挂载的设备列表
[root@izwz9194nuv8g0cwqfqsh3z ~]# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=188376k,mode=700)
......提供信息:
(1)媒体的设备文件名
(2)媒体挂载到虚拟目录的挂载点
(3)文件系统类型
(4)已挂载媒体的访问状态
使用mount需要root用户权限,手动挂载媒体设备的基本命令为
#mount -t type device directory
-t type:指定磁盘被格式化的文件系统类型,通常不必指定。mount 会自动选择正确的型态,如vfat为windows长文件系统,U盘常使用该格式
device:该存储设备的设备文件位置
directory:挂载点在虚拟目录中的位置
如手动将U盘/dev/sdb1挂载到/media/disk,可用以下命令:
#mount -t vfat /dev/sdb1 /media/disk
经常使用的参数有 -o,允许在挂载文件系统时添加一些以逗号分隔开的额外选项,如
ro:以只读形式挂载
rw:以读写形式挂载
user:允许普通用户挂载文件系统
check=none:挂载文件系统时不进行完整性校验
loop:挂载一个文件
-
umount命令
注意:是umount,不是unmount,格式为
#umount [directory | device]
该命令支持通过设备文件或者是挂载点来指定要卸载的设备,如果有程序正在使用该设备将卸载失败,如果想查看具体卸载信息可以加上-v参数
-
df命令
df命令可以查看所有已挂载磁盘的使用情况,显示每个有数据的已挂载文件系统。
[root@izwz9194nuv8g0cwqfqsh3z ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 41151808 1642764 37395612 5% /
devtmpfs 931516 0 931516 0% /dev
tmpfs 941860 0 941860 0% /dev/shm信息:
Filesystem:设备的设备文件位置
1K-blocks:能容纳多少个1024字节大小的块
Used:已使用多少个1024字节大小的块
Mounted on:设备挂载到了哪个挂载点上
df命令最常用的参数为-h,把磁盘空间显示为用户易读的形式
[root@izwz9194nuv8g0cwqfqsh3z ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 1.6G 36G 5% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
-
du命令
发生磁盘即将耗尽该怎么办?du命令用来显示某个特定目录的磁盘使用情况,可以用来判断系统上是否有超大文件
[root@izwz9194nuv8g0cwqfqsh3z ~]# du
8 ./.oracle_jre_usage
8 ./.pip
4 ./.ssh
28 ./.cache/pip/http/f/e/d/0/e
32 ./.cache/pip/http/f/e/d/0
36 ./.cache/pip/http/f/e/d
40 ./.cache/pip/http/f/e
44 ./.cache/pip/http/f
48 ./.cache/pip/http
56 ./.cache/pip
60 ./.cache左边的数值是每个文件或目录占用的磁盘块数,逐级向上
以上直接用du命令毫无意义,需要加参数
-c:显示所有已列出文件总的大小
-h:按用户易读的格式输出大小,即用K、M、G等单位
-s:显示每个输出参数的总计
如下所示
[root@izwz9194nuv8g0cwqfqsh3z ~]# du -ch
8.0K ./.oracle_jre_usage
8.0K ./.pip
4.0K ./.ssh
28K ./.cache/pip/http/f/e/d/0/e
32K ./.cache/pip/http/f/e/d/0
36K ./.cache/pip/http/f/e/d
40K ./.cache/pip/http/f/e
44K ./.cache/pip/http/f
48K ./.cache/pip/http
56K ./.cache/pip
60K ./.cache
8.0K ./tast
8.0K ./mod_test
140K .
140K total
3、处理数据文件
排序数据
-
sort命令
sort命令默认语言排序规则对文本文件中的数据进行排序
[root@izwz9194nuv8g0cwqfqsh3z ~]# cat file1
one
two
three
four
five
six
seven
eight
nine
ten
[root@izwz9194nuv8g0cwqfqsh3z ~]# sort file1
eight
five
four
nine
one
seven
six
ten
three
two
对数字排序加参数 -n 即可,否则会将数字按照文本排序
对月份排序加参数 -M,不过需要是Jan、Feb、Mar、Jun......这类的月份
降序输出使用参数 -r
-k与-t参数在对按字段分隔的数据进行排序时非常有效,
[root@izwz9194nuv8g0cwqfqsh3z ~]# cat /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
...
[root@izwz9194nuv8g0cwqfqsh3z ~]# 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
解释:数据按第三个字段——用户ID的数值进行排序
搜索数据
-
grep命令
grep命令方便大文件中查找数据,使用方式为
#grep [options] pattern [file]
grep命令会在输入或者指定的文件中查找包含匹配指定模式的字符的行并输出
pattern就是我们要查找的字符串,也可以是正则表达式
例如:
[root@izwz9194nuv8g0cwqfqsh3z ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
如果要进行反向搜索(屏蔽),则加 -v 参数(其他地方-v 参数具有输出处理过程的作用)
如果要显示行号,则加 -n 参数(cat命令中,-n也是输出行号)
如果要知道一共多少行含有匹配的模式,则加 -c 参数(在du命令中, -c是计算和)
如果仅显示匹配的字串,而非字串所在的行,则加 -o参数
如果要指定多个匹配模式,则加 -e 参数
[root@izwz9194nuv8g0cwqfqsh3z ~]# grep -e root -e admin /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
admin:x:1000:1000::/home/admin:/bin/bash
-
egrep命令
egrep是grep的扩展,和grep -e 是一样的。
grep中的匹配字符,全部当作字符串来处理,但是不支持正则表达式的特殊元字符....
egrep可以支持元字符...
grep可以匹配shell通配符:
字符 | 含义 | 实例 |
* | 匹配 0 或多个字符 | a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
? | 匹配任意一个字符 | a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
[list] | 匹配 list 中的任意单一字符 | a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
[!list] | 匹配 除list 中的任意单一字符 | a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 |
[c1-c2] | 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] | a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 |
{string1,string2,...} | 匹配 sring1 或 string2 (或更多)其一字符串 | a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。 |
需要说明的是:通配符看起来有点象正则表达式语句,但是它与正则表达式不同的,不能相互混淆。把通配符理解为shell 特殊代号字符就可。而且涉及的只有,*,? [] ,{} 这几种。
而egrep可以匹配shell元字符(特殊字符 Meta):
字符 | 说明 |
IFS | 由 <space> 或 <tab> 或 <enter> 三者之一组成(我们常用 space )。 |
CR | 由 <enter> 产生。 |
= | 设定变量。 |
$ | 作变量或运算替换(请不要与 shell prompt 搞混了)。 |
> | 重导向 stdout。 * |
< | 重导向 stdin。 * |
| | 命令管线。 * |
& | 重导向 file descriptor ,或将命令置于背境执行。 * |
( ) | 将其内的命令置于 nested subshell 执行,或用于运算或命令替换。 * |
{ } | 将其内的命令置于 non-named function 中执行,或用在变量替换的界定范围。 |
; | 在前一个命令结束时,而忽略其返回值,继续执行下一个命令。 * |
&& | 在前一个命令结束时,若返回值为 true,继续执行下一个命令。 * |
|| | 在前一个命令结束时,若返回值为 false,继续执行下一个命令。 * |
! | 执行 history 列表中的命令。* |
shell转义符
有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。
字符 | 说明 |
‘’(单引号) | 又叫硬转义,其内部所有的shell 元字符、通配符都会被关掉。注意,硬转义中不允许出现’(单引号)。 |
“”(双引号) | 又叫软转义,其内部只允许出现特定的shell 元字符:$用于参数代换 `用于命令代替 |
\(反斜杠) | 又叫转义,去除其后紧跟的元字符或通配符的特殊意义。 |
如:
$
ls
\*.txt
ls
: 无法访问 *.txt: 没有那个文件或目录
$
ls
'*.txt'
ls
: 无法访问 *.txt: 没有那个文件或目录
$
ls
'a.txt'
a.txt
$
ls
*.txt
a.txt b.txt
可以看到,加入了转义符 “*”已经失去了通配符意义了。
压缩数据
主要有以下几种文件压缩工具
bzip2:压缩.bz2格式文件
compress:压缩.Z格式文件,最初的压缩工具,快没人用了
gzip:压缩.gz格式文件,GNU压缩工具,最流行的压缩工具
zip:压缩.zip格式文件
以gzip软件包为代表,含有以下工具
gzip:压缩文件
gzcat:用来查看压缩过的文本文件的内容
gunzip:解压文件
gzip命令会压缩你在命令行指定的文件,也可以用通配符一次性批量压缩文件
[root@izwz9194nuv8g0cwqfqsh3z ~]# gzip test
[root@izwz9194nuv8g0cwqfqsh3z ~]# ll te*
-rw-r--r-- 1 root root 31 Feb 20 15:28 test.gz
归档数据
Unix与Linux上最广泛使用的归档工具是tar命令
tar命令最初用来将文件写到磁带设备上归档,也能把输出写到文件里,用来归档数据
格式如下
tar function [options] object1 object2
其中,function参数定义了tar命令该怎么做,包括
-A :将一个已有tar归档文件追加到另一个tar归档文件
-c:创建一个新的tar归档文件(--create)
-d:检查归档文件与文件系统的不同之处(--diff);从已有tar归档文件中删除(--delete)
-r:追加文件到tar归档文件末尾
-t:列出已有tar归档文件内容
-u:更新归档文件(--update)
-x:从tar归档文件中提取文件(--extract)
以上每个命令的功能可用选项来针对tar归档文件定义特定行为,常见选项有
-C directory:切换到指定目录
-f file:输出结果到文件或设备file
-j:将输出重定向给bzip2命令用来压缩内容
-p:保留所有文件权限
-v:在处理时显示文件(清晰反应处理过程)
-z:将输出重定向给gzip命令来压缩内容
下面是示例,创建归档文件为
#tar -cvf test.tar test/ test2/
其中,c即创建,v即显示文件,f即输出到test.tar
接着列出test.tar中的文件目录(但是不提取),可以用命令
#tar -tf test.tar
执行该命令后界面会输出tar中所包含的目录test与test
最后可以提取内容,使用命令
#tar -xvf test.tar
即可将归档的文件或目录在当前目录下重新创建,这是Linux中分发开源程序源码文件所采用的最普遍的方法
如果下载的文件后缀为.tgz,这是gzip压缩过的tar文件,可以用以下命令来解压
#tar -zxvf filename.tgz
其中,-z意味着将内容重定向给gzip,之后执行-xvf进行提取
哈哈哈,之前一直死记了-zxvf,现在总算完全明白怎么回事了!!看书真的很重要~