禅道博客

分享专业技术知识,文章内容干货满满

《Linux命令行与shell脚本编程大全》 第4-5章

2023-12-21 15:18:50
刘洪
原创 914
摘要:这两章包含监测程序、监测磁盘空间、处理数据文件、理解Shell、Shell的父子关系、理解Shell的内建命令等内容。

4.1 监测程序

当程序运行在系统上时,这便是进程(process)。

file-download-586080.json

  1. ps  默认只显示运行在当前控制台下的属于当前用户的进程。  可以接很多选项,比如 -A表示所有进程  -e:显示所有运行在系统上的进程等。

    • 备注:运行的bash shell(shell也是运行在系统上的一个程序,以及ps命令)

  2. 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:实时显示

file-download-589487.json

ps -aux:

file-download-589513.json

下面是对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:默认情况下输出当前系统上挂载的设备列表

file-download-589554.json

可以看到四部分信息:

  • 媒体的设备文件名

  • 媒体挂载到虚拟目录的挂载点

  • 文件系统类型

    • 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 处理数据文件

  1. 排序: 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程序。

file-download-589612.json

2.默认的交互shell会在用户登录某个虚拟控制台终端时启动。

不过还有另外一个默认的shell是/bin/sh,它作为默认的shell,用于那些需要在启动时使用的shell脚本

ls -l /bin/sh   进行查看

file-download-589614.json

乌班图的发行版中默认的系统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。可以展示进程间的嵌套结构。

file-download-589624.json

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  可以查看后台作业信息

file-download-589636.json

还可以这样,将进程列表置入后台。

$ (sleep 2; echo $BASH_SUBSHELL; sleep 2;)&

协程:可以同时做两件事,它在后台生成一个子shell,并在这个子shell中执行命令。

使用coproc命令进行协程处理:

$ coproc sleep 10

还可以这样:$coproc MyJob { sleep 10; }  // 相当于给sleep 10取了个名字。注意那几个空格

 

5.3 理解shell的内建命令

  1. 内部命令:例如ls cd 等

  2. 外部命令:又称文件系统命令,存在与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

file-download-589652.json

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  进程 子进程 都会受到环境变量的影响。

暂时没有记录
评论通过审核后显示。