本章内容
- 管理进程
- 获取磁盘统计信息
- 挂载新磁盘
- 排序数据
- 归档数据
4.1 监测程序
[jingpan@localhost ~]$ ps
PID TTY TIME CMD
24493 pts/0 00:00:00 bash
24524 pts/0 00:00:00 ps
[jingpan@localhost ~]$
没什么特别的吧? 默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户的进程。在此例中,我们只运行了bash shell
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 12月01 ? 00:00:26 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root 2 0 0 12月01 ? 00:00:00 [kthreadd]
root 3 2 0 12月01 ? 00:00:01 [ksoftirqd/0]
root 5 2 0 12月01 ? 00:00:00 [kworker/0:0H]
root 7 2 0 12月01 ? 00:00:00 [migration/0]
root 8 2 0 12月01 ? 00:00:00 [rcu_bh]
root 9 2 0 12月01 ? 00:02:59 [rcu_sched]
root 10 2 0 12月01 ? 00:00:07 [watchdog/0]
root 12 2 0 12月01 ? 00:00:00 [kdevtmpfs]
root 13 2 0 12月01 ? 00:00:00 [netns]
root 14 2 0 12月01 ? 00:00:00 [khungtaskd]
root 15 2 0 12月01 ? 00:00:00 [writeback]
root 16 2 0 12月01 ? 00:00:00 [kintegrityd]
root 17 2 0 12月01 ? 00:00:00 [bioset]
root 18 2 0 12月01 ? 00:00:00 [kblockd]
root 19 2 0 12月01 ? 00:00:00 [md]
root 22 2 0 12月01 ? 00:00:00 [kswapd0]
root 23 2 0 12月01 ? 00:00:00 [ksmd]
root 24 2 0 12月01 ? 00:00:02 [khugepaged]
root 25 2 0 12月01 ? 00:00:00 [crypto]
root 33 2 0 12月01 ? 00:00:00 [kthrotld]
root 35 2 0 12月01 ? 00:00:00 [kmpath_rdacd]
root 36 2 0 12月01 ? 00:00:00 [kpsmoused]
root 37 2 0 12月01 ? 00:00:00 [ipv6_addrconf]
root 56 2 0 12月01 ? 00:00:00 [deferwq]
root 90 2 0 12月01 ? 00:00:00 [kauditd]
root 268 2 0 12月01 ? 00:00:00 [ata_sff]
root 273 2 0 12月01 ? 00:00:00 [scsi_eh_0]
root 274 2 0 12月01 ? 00:00:00 [scsi_tmf_0]
root 275 2 0 12月01 ? 00:00:00 [scsi_eh_1]
root 276 2 0 12月01 ? 00:00:00 [scsi_tmf_1]
root 285 2 0 12月01 ? 00:00:00 [ttm_swap]
root 290 2 0 12月01 ? 00:00:16 [kworker/0:1H]
root 355 2 0 12月01 ? 00:00:00 [kdmflush]
root 356 2 0 12月01 ? 00:00:00 [bioset]
root 367 2 0 12月01 ? 00:00:00 [kdmflush]
root 368 2 0 12月01 ? 00:00:00 [bioset]
上例中,我们略去了输出中的不少行,以节约空间。但如你所看到的,Linux系统上运行着很多的进程。这个例子用了两个参数:
[root@localhost log]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 28585 24493 0 80 0 - 41518 do_wai pts/0 00:00:00 su
4 S 0 28594 28585 0 80 0 - 27121 do_wai pts/0 00:00:00 bash
4 R 0 30101 28594 0 80 0 - 27036 - pts/0 00:00:00 ps
注意使用了-l参数之后出现的那些额外的列。
root 24488 1972 0 16:11 ? 00:00:00 sshd: jingpan [priv]
jingpan 24492 24488 0 16:11 ? 00:00:00 sshd: jingpan@pts/0
jingpan 24493 24492 0 16:11 pts/0 00:00:00 -bash
jingpan 30764 24493 0 17:11 pts/0 00:00:00 ps -efH
注意CMD这列输出内容的平移,它表明运行中程序的层级:首先是root用户启动的sshd进程,然后,由于这个会话是从
[jingpan@localhost ~]$ ps l
F UID PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND
0 500 3098 3097 20 0 108480 1880 do_wai Ss pts/1 0:00 -bash
0 500 3562 3561 20 0 108480 1912 do_wai Ss pts/4 0:00 -bash
0 500 3603 3562 20 0 100952 604 inotif S+ pts/4 0:00 tail -f /home/jingpan/collector/log/agent.log
0 500 4673 4672 20 0 108480 1880 do_wai Ss pts/3 0:00 -bash
0 500 4699 4673 20 0 108140 996 - R+ pts/3 0:00 ps l
其中大部分的输出跟我们使用Unix风格参数时的输出是一样的,只有一小部分不同。
-
-
- <:该进程运行在高优先级上。
- N:该进程运行在低优先级上。
- L:该进程有页面锁定在内存中。
- s:该进程是个控制进程。
- l:该进程是多线程的。
-
root 1972 1 0 10:27 ? 00:00:00 /usr/sbin/sshd
root 3095 1972 0 10:31 ? 00:00:00 \_ sshd: jingpan [priv]
jingpan 3097 3095 0 10:31 ? 00:00:00 | \_ sshd: jingpan@pts/1
jingpan 3098 3097 0 10:31 pts/1 00:00:00 | \_ -bash
root 3269 3098 0 10:41 pts/1 00:00:00 | \_ su root
root 3272 3269 0 10:41 pts/1 00:00:00 | \_ bash
root 4670 1972 0 11:53 ? 00:00:00 \_ sshd: jingpan [priv]
jingpan 4672 4670 0 11:53 ? 00:00:00 \_ sshd: jingpan@pts/3
jingpan 4673 4672 0 11:53 pts/3 00:00:00 \_ -bash
jingpan 5773 4673 0 13:02 pts/3 00:00:00 \_ ps -ef --forest
这种格式便得跟踪子进程和父进程变得十分容易。
4.1.2 实时监测进程
默认情况下,top命令在启动时会按照%CPU值来排序。
%CPU = CPU usage
%MEM = Memory usae(RES)
VIRT = Virtual Image(kb) 进程占用虚拟内存总量
RES = Resident size (kb) 进程占用的物理内存总量
SHR = Shared Mem size(kb)
命令 描述
f 添加/移除输出中不同信息列
o 更改信息行的显示顺序
F或O 选择一列来将进程排序(默认为%CPU)
R 切换正常排序还是倒序排序
4.1.3 结束进程
Linux沿用了Unix进行进程间通信的方法。在Linux上,进程之间通过信息来通信。进程的信息
就是预定义好的一个消息,进程能识别它并决定忽略还是作出反应。
信号 名称 描述
1 HUP 挂起
2 INt 中断
9 KILL 无条件终止
15 TERM 尽可能终止
要发送进程信号,你必须是进程的属主或登录为root用户。
[jingpan@localhost ~]$ kill 2582
-bash: kill: (2582) - 不允许的操作
TERM信号告诉进程可能的话停止运行。不过,如果有跑飞的进程,它通常会忽略这个请求。
通常可接受的处理方式是先试试TERM信号。如果进程忽略它,可用INT或HUP信号。程序收到了这些信号,
会在关掉进程前有序地停止它正在做的事。KILL信号的强制性最强。当进程接收到这个信号时,它会立即停止运行。
这可能会导致文件损坏。
killall命令非常强大,它支持通过进程名而不是进程号来结束进程。killall命令也支持通配符,这在系统因
负载过大而变得很慢很慢时很有用。
[jingpan@localhost ~]$ killall httpd*
上便的命令结束了所有以http开头的进程,比如Apache Web服务器的httpd服务。
4-2 监测磁盘空间
4.2.1 挂载存储媒体
默认情况下,mount命令会输出当前系统上挂载的设备列表:
[root@localhost jingpan]# mount
/dev/sda1 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/home/kvm/centos72.iso on /mnt type iso9660 (rw,loop=/dev/loop0)
[jingpan@localhost ~]#mount -t iso9660 -o loop centos72.iso /mnt
mount 命令会将镜像centos72.iso文件当做真实cd来挂载,用户就能访问它的文件系统了。
2.umount命令
umount命令支持通过设备文件或者是挂载点来指定卸载的设备。如果有任何程序正在使用
设备上的文件,系统就不会允许你来卸载它。
[root@localhost jingpan]# umount /home/kvm/centos72.iso
umount: /mnt: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
这时可用lsof命令获得使用它的进程信息,然后在应用中停止使用该设备或停止该进程。
[root@localhost jingpan]# lsof /mnt
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 8461 jingpan cwd DIR 7,0 2048 21312 /mnt/images
[root@localhost jingpan]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 453034512 18062116 411952876 5% /
tmpfs 2026904 76 2026828 1% /dev/shm
df命令有一些命令行参数可用,但基本上你不会用到。一个常用的参数是-h.它会把输出中的
磁盘空间按人类可读的形式显示,通常用M来替代兆字节,用G替代吉字节:
[root@localhost jingpan]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 433G 18G 393G 5% /
tmpfs 2.0G 76K 2.0G 1% /dev/shm
4.2.3 使用du命令
通过df 命令,你很容易发现哪个磁盘就快要没存储空间了。系统管理员面临的下一个总量是发生这种情况时怎么办。
另一个有用的命令是du命令。du命令可以显示某个特定目录(默认情况下是当前目录)的磁盘使用情况。这是
用来判断你系统上某个目录下是不是有超大文件的快速方法。
默认情况下,du命令会显示当前目录下的有的文件、目录和子目录的磁盘使用情况,它会以磁盘的块为单位来显示每个
文件或目录占用了多大存储。在标准的主目录中,这个输出会是一个比较长的列表。下面是du命令的部分输出:
[root@localhost etc]# du
20 ./redhat-lsb
4 ./gnupg
4 ./sssd
20 ./PackageKit
12 ./sysconfig/modules
12 ./sysconfig/cbq
8 ./sysconfig/networking/profiles/default
12 ./sysconfig/networking/profiles
4 ./sysconfig/networking/devices
20 ./sysconfig/networking
4 ./sysconfig/console
232 ./sysconfig/network-scripts
520 ./sysconfig
3960 ./selinux/targeted/modules/active/modules
13100 ./selinux/targeted/modules/active
13104 ./selinux/targeted/modules
8284 ./selinux/targeted/policy
4 ./selinux/targeted/logins
28 ./selinux/targeted/contexts/users
592 ./selinux/targeted/contexts/files
676 ./selinux/targeted/contexts
22080 ./selinux/targeted
22100 ./selinux
56 ./xinetd.d
4 ./dbus-1/session.d
156 ./dbus-1/system.d
172 ./dbus-1
8 ./dhcp/dhclient-exit-hooks.d
12 ./dhcp/dhclient.d
24 ./dhcp
8 ./cron.monthly
8 ./audit/rules.d
20 ./audit
4 ./alternatives
4 ./terminfo
4 ./maven/fragments
12 ./maven
4 ./cgconfig.d
28 ./yum.repos.d
84 ./init
24 ./ld.so.conf.d
8 ./rsyslog.d
16 ./latrace.d/sysdeps/x86_64
20 ./latrace.d/sysdeps
168 ./latrace.d
4 ./lsb-release.d
16 ./httpd/conf.d
56 ./httpd/conf
76 ./httpd
8 ./kde/env
12 ./kde
12 ./oddjobd.conf.d
40 ./bash_completion.d
4 ./hal/fdi/preprobe
4 ./hal/fdi/policy
4 ./hal/fdi/information
16 ./hal/fdi
20 ./hal
4 ./cron.weekly
4 ./ssl
8 ./prelink.conf.d
12 ./alsa
8 ./portreserve
8 ./bluetooth
8 ./avahi
8 ./purple
144 ./postfix
4 ./skel/.gnome2
4 ./skel/.mozilla/plugins
4 ./skel/.mozilla/extensions
12 ./skel/.mozilla
每行输出开始地方的数值,是每个文件或目录占用的磁盘块数。注意这个列表昌从一个目录层级的最底部开始的,
然后按文件、子目录、目录逐级向上。
du命令(不加参数,用默认参数)作用并不大。
-c:显示所有已列出文件总的大小。
-h:按人类可读的格式输出大小,
-s:显示每个输出参数的总计。
4.3 处理数据文件
Linux系统提供了一些命令行工具秋处理大量数据。本节将会介绍每个系统管理员以及每个
日常Linux用户都应该知道的、能叫生活轻松的基本命令。
4.3.1 排序数据
处理大量数据时的一个常用命令是sort命令。从
默认情况下,sort命令按你为这个会话指定的默认语言的排序规则来对对文本文件中的数据进行排序。
[root@localhost ch4]# cat file1
one
two
three
four
five
[root@localhost ch4]# sort file1
five
four
one
three
two
相当简单。但事情并非总是像看起那么简单。看下面的例子:
[root@localhost ch4]# cat file2
1
2
100
45
3
10
145
75
[root@localhost ch4]# sort file2
1
10
100
145
2
3
45
75
你期望这些数字能按值排序,但叫你失望了。默认情况下,sort命令会把数字当做字符而执行
sort命令把数字识别成数字而不是字符,并且将它们按值排序:
[root@localhost ch4]# sort -n file2
1
2
3
10
45
75
100
145
现在的结果是不是好多了?另一个常用的参数是-M,按月排序。Linux的日志文件经常会在每行
Nov 06 13:52:10 Installed: tigervnc-server-1.1.0-24.el6.x86_64
[root@localhost ch4]# sort file3
Apr
Aug
Dec
Feb
Jan
Jul
Jun
Mar
May
Nov
Oct
Sep
-n参数在排序数值时非常有用,比如du命令的输出:
[root@localhost jingpan]# du -s * | sort -rn
104424 net-snmp-5.7.2
69784 boot
18192 nginx-1.12.2
6136 net-snmp.tar.gz
1492 collector
664 c
376 awk
80 linux_c
68 c_v
60 c_example
32 linux
32 collector-linux.zip
12 test
8 snmp_install.sh
4 桌面
4 音乐
4 下载
4 文档
4 图片
4 视频
4 模板
4 公共的
4 rpm_check.txt
4 LICENCE.KEY
4 ch5
4 centos7.xml
4 centos74.xml
注意,-r 参数让结果按降序输出,这样就更容易看到目录下的哪些文件占用空间最多。
你会经常需要大文件中找一行数据,而这行数据埋藏在文件的中间。这时,你并不需要人工看完整个文件,你只需要 grep命令
来帮查找。
grep 命令会到输入中或你指定的文件中查找包含匹配指定模式的字符行。grep的输出就是包含了匹配模式的行。
[jingpan@localhost ch4]$ grep three file1
three
[jingpan@localhost ch4]$ grep t file1
two
three
[jingpan@localhost ch4]$
第一个例子在文件file1中搜索能匹配模式three的文本,grep命令输出了匹配了该模式的行。
第二个例子在文件file1中搜索能匹配模式t的文本。这个例子里,file1中有两行匹配了指定的模式,两行都输出了。
如果要进行反向搜索(输出不匹配该模式的行),可加-v参数:
[jingpan@localhost ch4]$ grep -v t file1
one
four
five
[jingpan@localhost ch4]$
v如果要显示匹配模式的行所在的行号,可加-n参数:
[jingpan@localhost ch4]$ grep -n t file1
2:two
3:three
如果只要知道多少行包含有匹配的模式,可以-c参数:
[jingpan@localhost ch4]$ grep -c t file1
2
如果要指定多于一个匹配模式,得到满足两个模式中任意一个的所有结果,用-e参数来指定每个模式:
[jingpan@localhost ch4]$ grep -e t -e f file1
two
three
four
five
这个例子输出了含有字符t或f的所有行。
默认情况下,grep命令用基本的Unix风格正则表达式来匹配模式。Unix风格正则表达式采用特殊字符来定义怎样查找匹配的
模式。
这里有个简单在grep搜索中使用正则表达式的例子。
[jingpan@localhost ch4]$ grep [tf] file1
two
three
four
five
正则表达式中的方括号个表明grep应该搜索包含t 或者f字符的匹配。如果不用正则表达式,grep就会搜索匹配字符串tf的文本。
4.3.3压缩数据
1.bzip2工具
默认情况下,bzip2命令尝试压缩原始文件,并用压缩后的文件(同样的文件名后加.bz2扩展)替换它:
[root@localhost ch4]# ls -l
总用量 248
-rw-r--r-- 1 root root 24 2月 26 17:17 file1
-rw-r--r-- 1 root root 23 2月 26 17:19 file2
-rw-r--r-- 1 root root 48 2月 27 10:42 file3
-rwxr-xr-x 1 root root 239000 2月 28 10:02 myprog
[root@localhost ch4]# bzip2 myprog
[root@localhost ch4]# ls -l
总用量 124
-rw-r--r-- 1 root root 24 2月 26 17:17 file1
-rw-r--r-- 1 root root 23 2月 26 17:19 file2
-rw-r--r-- 1 root root 48 2月 27 10:42 file3
-rwxr-xr-x 1 root root 111880 2月 28 10:02 myprog.bz2
bzip2命令自动用压缩后的bzip2文件替换了原文件,.bz2扩展名说明我们采用什么技术进行压缩的。
解压文件用bunzip2命令:
[root@localhost ch4]# bunzip2 myprog.bz2
[root@localhost ch4]# ls -l
总用量 248
-rw-r--r-- 1 root root 24 2月 26 17:17 file1
-rw-r--r-- 1 root root 23 2月 26 17:19 file2
-rw-r--r-- 1 root root 48 2月 27 10:42 file3
-rwxr-xr-x 1 root root 239000 2月 28 10:02 myprog
如你所见,解压后的文件又回到了原文件大小。如果压缩了文本文件,你无法再用cat、more或less
命令来查看文件的内容。这时,你可以用bzcat命令:
[root@localhost ch4]# bzip2 file1
[root@localhost ch4]# ls
file1.bz2 file2 file3 myprog
[root@localhost ch4]# bzcat file1.bz2
one
two
three
four
five
bzcat命令显示了压缩文件里的文本内容,而并不需要解压文件。
2.gzip工具
到目前为止,Linux上最流行的文件压缩工具就是gzi工具了。gzip包是GNU项目发起的试图替代原来Unix
的compress工具的压缩工具。
这些工具基本上跟bzip2工具的用法一样:
[root@localhost ch4]# gzip myprog
[root@localhost ch4]# ls -l my*
-rwxr-xr-x 1 root root 114811 2月 28 10:02 myprog.gz
[root@localhost ch4]#
gzip命令会压缩命令行指定的文件。你也可以在命令行指定几个文件名甚至用通配符来一次压缩几个文件:
[root@localhost ch4]# gzip my*
[root@localhost ch4]# ls -l my*
-rwxr-xr-x 1 root root 114813 2月 28 11:24 myprog.c.gz
-rwxr-xr-x 1 root root 114811 2月 28 10:02 myprog.gz
-rw-r--r-- 1 root root 31 2月 28 11:25 myscript__.gz
-rw-r--r-- 1 root root 29 2月 28 11:25 myscript.gz
gzip命令会压缩该目录中匹配通配符的每个文件。
3 zip工具
zip工具的强大之处在于,它能将整个目录下的文件都压缩进单个文件。这让它成为归档整个目录结构的理想工具。
[root@localhost linux]# zip -r ch4.zip ch4
adding: ch4/ (stored 0%)
adding: ch4/myprog.gz (deflated 0%)
adding: ch4/myscript.gz (deflated 17%)
adding: ch4/file2 (deflated 4%)
adding: ch4/file3 (deflated 2%)
adding: ch4/myprog.c.gz (deflated 0%)
adding: ch4/myscript__.gz (deflated 16%)
adding: ch4/file1.bz2 (stored 0%)
[root@localhost linux]# ls
这个例子创建了一个叫ch4.zip的zip文件,并递归目录ch4把找到的每个文件和目录都加进
该 zip文件。从输出可以看出。不是所有存进该zip文件的文件都能够被压缩。zip工具自动决定
针对每个单独文件的压缩类型。
4.3.4 归档数据
目前,Unix和Linux上最广泛使用的归档工具是tar命令
[jingpan@localhost linux]$ tar -cvf ch4.tar ch4/
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2
上面命令创建了一个含有ch4目录内容的ch4.tar的归档文件。
[jingpan@localhost linux]$ tar -tf ch4.tar
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2
列出tar文件ch4.tar的内容,但并不解压谁的。
[root@localhost linux]# tar -xvf ch4.tar
ch4/
ch4/myprog.gz
ch4/myscript.gz
ch4/file2
ch4/file3
ch4/myprog.c.gz
ch4/myscript__.gz
ch4/file1.bz2
如果tar文件是从一个目录结构创建的,那整个目录结构都会在当前目录下重新创建。
下载了开源软件之后,你会经常看到文件名以.tgz结尾。这些是gzip压缩过的tar文件,可以用命令
tar -zxvf filename.tgz