《Linux命令行与shell脚本编程大全》 第4-5章
原创- 2023-12-21 15:18:50
- 1273
本篇目录
4.1 监测程序
当程序运行在系统上时,这便是进程(process)。
-
ps 默认只显示运行在当前控制台下的属于当前用户的进程。 可以接很多选项,比如 -A表示所有进程 -e:显示所有运行在系统上的进程等。
-
备注:运行的bash shell(shell也是运行在系统上的一个程序,以及ps命令)
-
-
Linux系统使用的GNU ps命令支持的3种不同类型的命令行参数
-
Unix:前面加单破折线(AT&Unix系统原有ps命令继承)
-
-A(显示所有进程)
-
-N(显示与指定参数不符的所有进程)
-
-a(显示除控制进程和无终端进程外的所有进程)
-
-d(显示除控制进程外的所有进程)
-
-e(显示所有进程)
-
-c(cmdlist)
-
-G(grplist)(显示组ID在grplist中的进程)
-
-U(userlist)(显示属主的用户ID在userlist中的进程)
-
-g(grplist)(显示会话或组ID在grplist中的进程)
-
-p(pidlist)
-
-
ps -l 查看进程更多信息
-
UID:启动这些进程的用户
-
PID:进程的进程ID
-
PPID:父进程的进程ID
-
C:进程生命周期中的CPU利用率
-
TTY:进程启动时的终端设备
-
TIME:运行进程需要的累计CPU时间
-
CMD:启动的程序名称
-
PRI:进程的优先级(数字越大代表越低的优先级)
-
ADDR:进程的内存地址
-
F:内核分配给进程的系统标记
-
S:进程的状态(O正在运行,S代表正在休眠,R代表可运行,T代表停止,Z代表僵尸进程,进程已结束资源还没有回收,但是父进程也不在了,无法回收)
-
SZ:假如进程被换出,所需交换空间的大致大小
-
WCHAN:进程休眠的内核函数地址
-
-
-
BSD:前面不加破折线
-
GNU:前面加双破折线
4.1.2 实时监测进程
top:实时显示
ps -aux:
下面是对ps -aux 指令输出信息的字段解释:
USER:启动该进程的用户,因为一台服务器可以有很多用户,每个用户都可以启动进程。
PID:该进程的ID号,在当前系统中是唯一的,需要杀死进程的时候,就是kill pid 命令杀死进程。
%CPU:CPU占用的百分比,可以超过100,因为linux系统一般都是多核心的。如果是10个核心,那总共就是1000%
%MEM:内存占用的百分比
VSZ:占用虚拟内存(swap空间)的大小,VSZ表示如果一个程序完全驻留在内存的话需要占用多少内存空间;
RSS:占用常驻内存(物理内存)的大小,RSS指明了当前实际占用了多少内存;
TTY:该进程在哪个终端上运行。“?”表示未知或不需要终端
STAT:显示了进程当前的状态,
S(休眠):大S, 进程处在睡眠状态,表明这些进程在等待某些事件发生–可能是用户输入或者系统资源的可用性;
R(运行): 正在运行,或者即将要运行
Z(僵死):
在一个进程调用了exit之后,该进程并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构。在Linux进程的5种状态中,僵尸进程是非常特殊的一种,它已经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵尸进程不再占有任何内存空间。对处于僵死状态的进程应予以手动终止。
<(高优先级)、
N(低优先级)、
s(父进程):小s, 进程的领导者(在它之下有子进程);
+(前台进程):比如你执行 python aaa.py命令,则就是前台执行,就会有+显示,
但是如果你执行python aaa.py & 命令,则就是后台执行,就不会有+
START:该进程开始的时间,什么时间开始的。
TIME: 该进程已经占用的CPU时间,可以理解为该进程已经执行了多长时间.
该时间并不一定是从start开始的。如果是多进程的话,则time代表是该子进程占用了多长时间cpu
一个子进程执行完毕之后,新的子进程开始执行,则该参数从0开始计数。
COMMAND:启动该进程的命令的名称.
4.1.3 结束进程
kill 4223 直接输入进程ID号结束
killall http* 通过进程名来结束进程,杀掉所有以http开头的进程
补充:关于目录的知识:
1. linux将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)
虚拟目录将安装在PC上的所有存储设备的文件路径纳入单个目录结构中。
2./home/liuhong/test/1.c 路径本身没有提供任何有关文件究竟存放在哪个物理磁盘上的信息
3.linux pc机上安装的第一块硬盘称为根驱动器。根驱动器包含了虚拟目录的核心,其他目录都是那里开始构建的。
4. Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然而实际上他们却存储在另外一个驱动器中。
4.2 监测磁盘空间
定义:Linux文件系统将所有的磁盘都并入一个虚拟目录下,再使用新的存储媒体之前,需要把它放到虚拟目录下,这个工作叫做挂载(mounting)。
1.mount:默认情况下输出当前系统上挂载的设备列表
可以看到四部分信息:
-
媒体的设备文件名
-
媒体挂载到虚拟目录的挂载点
-
文件系统类型
-
vfat:windows长文件系统-文件类型说明它是在window上被格式化的。
-
ntfs:windows NT\XP\Vista windows7使用的高级文档系统
-
iso9660:标准CD-ROM文件系统。
-
-
已挂载媒体的访问状态
手动挂载:mount -t type device directory
2. 媒体设备挂载到了虚拟目录以后,root用户就有了该设备的所有访问权利,而其他用户则会被限制。
3. umount。从Linux上移除一个可移动设备时,不能从系统上移除,而应该先卸载。
-
umount [directory | device]
4.df:查看所有已挂载磁盘的使用情况, 也可以df -h。比较容易看懂
5.du:快速查看目录中的磁盘使用情况(默认是当前目录)。也可以加 -h 参数。
-c 显示所有已列出文件总的大小
-s 显示每个输出参数的总计
-h 显示输出大小(K\M\G)
6.lsof:获取进程信息 lsof /path/to /device/node 或者lsof /path/to /mount/point
4.3 处理数据文件
-
排序: sort file
-
-n 识别成数字,按值排序
-
M 按月排序…
比如 sort -t ':' -k 3 test
可以看成里面的内容是这样 xxx1:xxx2:xxx3:xxx4:xxx5
表示对xxx3进行排序
-t: 指定一个用来区分键位置的字符
-r:表示降序排列。
-k: --key=pos1[pos1]。排序从pos1开始,如果指定了pos2的话到pos2结束。
-
竖线 | 将du命令的输出重定向到sort命令。
4.3.2 搜索数据
grep [options] pattern [file]
例如:grep t test // 在test中搜索能匹配模式t的文本
grep -v t test // 匹配没有t的
-n 可以加上行号
-e 匹配多个模式, grep -e t -e f test // 找有t或f的所有行
4.3.3 压缩数据
4.3.4 归档数据 tar
5.1理解shell
1. cat /etc/passwd
可以查看每个用户自己的默认的shell程序。
2.默认的交互shell会在用户登录某个虚拟控制台终端时启动。
不过还有另外一个默认的shell是/bin/sh,它作为默认的shell,用于那些需要在启动时使用的shell脚本
ls -l /bin/sh 进行查看
乌班图的发行版中默认的系统shell(dash shell)和默认的交互shell(bash shell)并不相同。
可以直接 dash 来启动 dash shell
exit 退出
5.2 shell 的父子关系
一个shell可以创建另外一个shell(子shell)。
ps -f 查看一下。
bash shell就是一个进程(运行的程序)。
输入bash就会创建一个子shell。exit退出。 ps- f --forest。可以展示进程间的嵌套结构。
5.2.1 进程列表
$ pwd; ls; pwd; cd /; echo $BASH_SUBSHELL
这样可以让命令依次执行。这是在当前shell中执行的。
$ (pwd; ls; echo $BASH_SUBSHELL;) // 这个是在子shell中执行。
() 还可以嵌套,比如pwd;(pwd; (ls; cd /home))
echo $BASH_SUBSHELL 若返回0,表示没有子shell。
$ sleep 300& // 后台运行命令,& 就是把命令置入后台模式
jobs 可以查看后台作业信息
还可以这样,将进程列表置入后台。
$ (sleep 2; echo $BASH_SUBSHELL; sleep 2;)&
协程:可以同时做两件事,它在后台生成一个子shell,并在这个子shell中执行命令。
使用coproc命令进行协程处理:
$ coproc sleep 10
还可以这样:$coproc MyJob { sleep 10; } // 相当于给sleep 10取了个名字。注意那几个空格
5.3 理解shell的内建命令
-
内部命令:例如ls cd 等
-
外部命令:又称文件系统命令,存在与bash shell之外的命令。并不是shell程序的一部分
通常位于 /bin /usr/bin /sbin /usr/sbin中。
外部 命令执行时会创建一个子进程。这种操作叫 衍生(forking)。
比如ps是一个外部命令,可以使用which 和 type命令找到它
$which ps
$ type -a ps
$ ls -l /bin/ps
-
内建命令:不需要子进程来执行,和shell是一体的,不需要借助外部程序文件来运行。
(1)比如 exit 和 cd是内建命令
$type exit
$type cd
-
有些命令有多种实现,比如pwd和echo既有外部命令也有内建命令
#type -a echo
which 只显示出外部命令文件。
type -a 显示出每个命令的两种实现。
-
窍门:对于多种实现的命令,默认执行是内建的,若想要执行外部命令可以指定对应的文件就好了。
$pwd // 执行的是内部命令
$/bin/pwd // 执行的外部命令
(2)查看历史执行的命令
$ history // 这个是内建命令
可以看到之前执行的命令,前面有个数字,代表命令编号。比如是38
$ !38 // 表示执行第38条命令
(3)$ !! 这个是执行上一条输入的命令。
(4)命令别名
alias 也是内建命令
$alias -p // 查看当前可用的别名
创建自己的命令
$alias xcyls='ls -al'
一个别名仅仅在它所被定义的shell进程中才有效。在 ~/.bashrc下修改可以对所有shell都有效
shell 子shell 进程 子进程 都会受到环境变量的影响。