• Linux友人帐之进程管理


    一、基本概念

    1、在Liux中,每一个程序都是有自己的一个进程,每一个进程都有一个id号!
    2、每一个进程呢,都会有一个父进程!
    3、进程可以有两种存在方式:前台!后台运行
    4、一般的话服务都是后台运行的,基本的程序都是前台运行的!

    1.1进程概念

    对于我们的了解来说,什么是进程呢? 有的资料是这么说:一个运行起来的程序(加载到内存)叫做进程;在内存中的程序叫做进程。也就是说,进程和程序相比具有动态属性。

    进程 = 内核数据结构(task_struct) + 进程对应的磁盘代码

     对于之前我们通过C写出的进度条程序来说,其本质就是一个文件并且存放在磁盘中。但是其并没有真正的运行,当我们运行程序的时候,文件就会从磁盘加载到内存,但是磁盘中那么多的文件全部加载到内存中明显是不现实的并且我们也不需要其他文件加载到内存,这时候就需要操作系统对文件进行管理从而只让我们想要执行的程序加载到内存,那操作系统是如何管理的呢?

    先描述,再组织

    1.2 进程的执行过程

    通过上述的概念,我们了解的并不多,那么接下来就来分析一下:如果有很多这样的进程加载到内存中,操作系统要如何进行管理呢? 即利用先描述再组织的思想。

    而所谓的先描述,这里引进了一个新的概念:PCB :进程控制块 struct task_struct{}

    1. 那么什么是进程控制块呢?

    进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合,称之为PCB(process control block)在Linux中描述进程的结构体叫做task_struct。

    在磁盘中的程序中,并没有进程控制块以及内部属性信息的存在,而是加载到内存之后通过操作系统的一系列的管理才出现的。

    1. //进程控制块
    2. struct task_struct
    3. {
    4. //该进程的所有属性
    5. //该进程对应的代码和属性地址
    6. struct task_struct *next;
    7. };

    2. 进程控制块如何对进程进行管理的呢?

    • 磁盘中的可执行程序在将要运行时,所有的进程中的数据(并不是程序本身)加载到内存中,此时操作系统会建立起一个PCB来保存每一个程序的信息

    这个时候PCB就会对每一个进程都建立起相应的结构体(即进程控制块)将对应的进程的属性、代码等匹配的传到这个结构体中:(这就是先描述)

    • 此时,操作系统就会将每一个进程控制块都连接起来,形成链表结构,并返回头结点。这样便通过数据结构的形式将进程的信息组织起来。

    通过这样的先描述再组织的思想,当我们处理优先级高的进程时,我们就可以通过遍历头结点,找到优先级最高的那个节点的信息,并将这个进程的代码执行。

    3.为什么要有进程控制块(PCB)呢?

    对进程管理的核心是对数据进行管理,因此当我们加载程序到内存之前,我们必须拿到所有程序的数据,由于拿到的数据杂乱无章并且未进行分类,这时候就需要PCB将其归类,将对应的数据放到相应的进程控制块里!

     即加载进程的时候,操作系统为了方便管理会new一个struct task_struct也就是进程控制块的结构体,然后一点点的将上面加载的数据填充到这里的内部属性(状态,标记,追踪等),因此这里再一次强调了:进程不是程序加载到内存,而是在内存中new了task_struct结构体!

    1.3服务

    • 计算机中,一个正在执行的程序或命令,被叫做“进程”(process)。
    • 启动之后一只存在、常驻内存的进程,一般被称作“服务”(service)。

     守护进程(Daemon)是在操作系统后台运行的一类特殊进程,它通常在系统启动时启动,并持续运行,不受用户登录和注销的影响。守护进程通常用于执行一些系统任务,如服务监听、日志记录、定时任务等,它们在后台默默地运行,不会与用户进行交互。

     在Linux系统中,`/usr/lib/systemd/system`目录是Systemd服务管理器的配置文件目录。Systemd是Linux系统中常用的初始化系统和服务管理工具,它负责启动、停止和管理系统中的各种服务。

    在`/usr/lib/systemd/system`目录下,可以找到各种服务单元(unit)文件,这些文件定义了Systemd服务的配置和行为。每个服务单元文件对应一个具体的服务,可以是系统级服务(如网络服务、日志服务)或用户级服务。

    常见的服务单元文件类型包括:

    1. `.service`:定义系统服务的配置和行为。
    2. `.socket`:定义套接字服务的配置和行为。
    3. `.target`:定义一个服务组,用于管理和控制其他服务。
    4. `.timer`:定义定时器服务,用于定期触发其他服务。
    5. `.path`:定义路径监视服务,用于监视文件或目录的变化。
    6. `.device`:定义设备服务,用于模拟设备。

    在`/usr/lib/systemd/system`目录中,可以找到系统安装的各种服务的配置文件,可以通过编辑这些文件来修改服务的行为和配置。注意,修改这些文件可能需要管理员权限。

    除了`/usr/lib/systemd/system`目录,Systemd还会读取`/etc/systemd/system`目录中的服务单元文件,这个目录用于本地系统的配置和自定义服务。

    总结来说,`/usr/lib/systemd/system`目录是Linux系统中Systemd服务管理器的配置文件目录,其中包含了各种服务的配置文件,可以通过编辑这些文件来修改服务的行为和配置。

    二、进程的基本操作

    2.1查看进程

    ps命令

     

    Linux ps命令是用来显示当前进程的状态的,类似于Windows的任务管理器。ps命令有很多参数,可以用来控制输出的格式和内容。ps命令的基本语法是:

    ps [options] [–help]

    其中,options可以是以下几种:

    • a:显示所有与终端相关的进程
    • u:显示进程的用户及内存等信息
    • x:显示没有控制终端的进程
    • aux:相当于au+x,显示所有包含其他用户的进程
    • l:显示长格式的信息,包括优先级、父进程ID等
    • e:显示所有进程

    ps命令输出的信息包括以下几个字段:

    • USER:进程的所有者
    • PID:进程的ID
    • %CPU:进程占用的CPU百分比
    • %MEM:进程占用的内存百分比
    • VSZ:进程占用的虚拟内存大小(单位KB)
    • RSS:进程占用的物理内存大小(单位KB)
    • TTY:进程运行的终端
    • STAT:进程的状态
    • START:进程开始的时间
    • TIME:进程占用CPU的运行时间
    • COMMAND:产生此进程的命令

    其中,STAT字段表示进程的状态,有以下几种可能:

    • D:无法中断的休眠状态(通常是I/O操作)
    • R:正在运行或可运行的状态
    • S:静止状态,可被唤醒
    • T:暂停或被追踪的状态
    • Z:僵尸状态,已终止但未被回收
    • <:高优先级的进程
    • N:低优先级的进程
    • L:有内存分页分配并锁在内存中(实时系统或I/O操作)
    • s:父进程(有子进程存在)
    • l:多线程的进程
    • +:前台运行的进程

     grep命令

    Linux grep命令是一个强大的文本搜索工具,它可以使用正则表达式来匹配文件或标准输入中的文本。grep命令的基本语法是:

    grep [选项] [模式] [文件]

    其中,选项可以控制grep命令的行为,如是否忽略大小写,是否显示行号,是否递归搜索等。模式是要匹配的字符串或正则表达式。文件是要搜索的文件名,可以是多个文件,如果省略文件参数,则默认从标准输入中读取数据。

    grep命令有两个变体,分别是egrep和fgrep。egrep命令相当于grep -E,它使用扩展的正则表达式来匹配文本。fgrep命令相当于grep -F,它使用固定的字符串来匹配文本,不解释正则表达式中的特殊字符。

    pstree命令

    Linux pstree命令是用来显示当前进程的状态的,类似于Windows的资源管理器。pstree命令可以使用ASCII字符或UTF-8字符来显示进程之间的树状结构,清楚地表达进程之间的相互关系。pstree命令的基本语法是:

    pstree [选项] [pid|user]

    其中,选项可以是以下几种:

    • -p:显示进程的PID
    • -u:显示进程的所属用户
    • -a:显示进程的完整命令和参数
    • -c:不合并相同名称的进程
    • -n:按照PID排序进程
    • -l:使用长格式输出,不截断长名称
    • -A:使用ASCII字符连接进程树
    • -U:使用UTF-8字符连接进程树
    • -h:高亮显示指定的PID或用户的进程树
    • -H:高亮显示指定的PID或用户的进程树,并隐藏其他进程

    如果不指定pid或user参数,则默认显示所有进程,以init或systemd为根节点。如果指定pid参数,则只显示该进程及其子进程。如果指定user参数,则只显示该用户拥有的进程。

     2.2 结束进程

    结束进程有两种方式,下面就来介绍:

    1.通过指令结束进程

    Linux的kill,它可以让您控制和管理您的系统上运行的进程。kill命令的基本语法是:

    kill [options] pid

    其中,options是可选的参数,用于指定要发送给进程的信号,pid是要终止的进程的标识符。您可以使用不同的信号来影响进程的行为,例如:

    • 1 (HUP):重新加载进程。
    • 9 (KILL):强制杀死一个进程。
    • 15 (TERM):正常停止一个进程。

    2.通过ctrl + c快捷键

    通过快捷键ctrl + c也可以结束进程。

    2.3进程的系统调用

    getpid函数

    Linux的getpid函数是一个系统调用,它用于获取当前进程的进程标识符(PID)。PID是一个非负整数,用于唯一标识一个进程。getpid函数的原型如下:

    pid_t getpid(void);

    其中,pid_t是一个整型类型,定义在sys/types.h头文件中。getpid函数没有参数,返回值是调用进程的PID。如果发生错误,getpid函数不会失败,也不会设置errno变量。

    getpid函数的一个常见用途是生成唯一的临时文件名,例如:

    char filename[20]; sprintf(filename, "tmp.%d", getpid());

    这样可以保证不同的进程不会产生相同的临时文件名。另一个用途是在调试或日志记录中输出进程的信息,例如:

    printf("Process %d started.\n", getpid());

    这样可以方便地追踪进程的运行状态。

    getppid函数

    除了getpid函数,还有一个相关的函数是getppid函数,它用于获取当前进程的父进程的PID。父进程是指创建当前进程的进程,通常通过fork或vfork函数来创建子进程。getppid函数的原型如下:

    pid_t getppid(void);

    它和getpid函数类似,没有参数,返回值是父进程的PID。如果当前进程没有父进程,或者父进程已经终止,那么返回值是1,表示init进程。init进程是系统中第一个启动的进程,它负责初始化系统和启动其他服务。

    getppid函数的一个常见用途是在子进程中判断父进程是否还存活,例如:

    if (getppid() == 1) { printf("Parent process is dead.\n"); exit(1); }

    这样可以避免子进程成为孤儿进程,或者处理一些异常情况。

     三、主机状态

    top命令

    top命令是一个用于实时监视系统中运行进程的命令行工具。它提供了关于进程的详细信息,包括进程ID、CPU使用率、内存使用情况、进程优先级等。

    以下是top命令的一些常用选项:

    - `-d`:指定刷新间隔,单位为秒。
    - `-n`:指定刷新次数,达到指定次数后自动退出。
    - `-p`:指定要监视的进程ID。
    - `-u`:只显示属于指定用户的进程。
    - `-H`:显示进程的层次结构。
    - `-k`:以KB为单位显示内存使用情况。
    - `-o`:指定按照哪个字段进行排序。

    在top命令的交互界面中,可以通过按键来进行操作

    例如:

    - `h`:显示帮助信息。
    - `k`:终止一个进程。
    - `r`:改变一个进程的优先级。
    - `s`:改变刷新间隔。
    - `q`:退出top命令。

    通过top命令,可以实时监视系统中的进程状态,帮助用户了解系统的运行情况,并进行相应的管理和调优。

    top内容详解

    磁盘信息监控 

    df命令

    df命令是用于显示文件系统的磁盘空间使用情况的命令行工具。它会列出文件系统的挂载点、总容量、已使用空间、可用空间和使用率等信息。以下是df命令的一些常用选项:

    - `-h`:以人类可读的方式显示磁盘空间大小。
    - `-T`:显示文件系统的类型。
    - `-i`:显示inode的使用情况。
    - `-a`:显示所有文件系统,包括系统特有的伪文件系统。
    - `-x`:排除指定类型的文件系统。
    - `-l`:只显示本地文件系统。
    - `-P`:以POSIX标准输出格式显示。
    - `-t`:只显示指定类型的文件系统。

    示例用法:
    ```
    df -h   # 显示磁盘空间使用情况,以人类可读的方式
    df -hT  # 显示磁盘空间使用情况,包括文件系统类型
    df -i   # 显示inode的使用情况
    df -x tmpfs  # 显示除tmpfs文件系统外的磁盘空间使用情况
    df -l   # 只显示本地文件系统的磁盘空间使用情况
    ```

    通过df命令,可以查看文件系统的磁盘空间使用情况,帮助用户了解磁盘的剩余空间和使用率,并进行相应的管理和调整。

    iostat命令

    iostat命令是一个用于监视系统的磁盘I/O性能的命令行工具。它提供了关于磁盘、CPU和网络设备的统计信息,包括平均负载、磁盘读写速度、CPU利用率、I/O等待时间等。以下是iostat命令的一些常用选项:

    - `-c`:显示CPU利用率的统计信息。
    - `-d`:显示磁盘I/O的统计信息。
    - `-k`:以KB为单位显示磁盘I/O速度。
    - `-m`:以MB为单位显示磁盘I/O速度。
    - `-n`:显示网络设备的统计信息。
    - `-t`:显示时间戳。
    - `-x`:显示详细的磁盘I/O统计信息。

    示例用法:
    ```
    iostat -c   # 显示CPU利用率的统计信息
    iostat -d   # 显示磁盘I/O的统计信息
    iostat -d -k   # 以KB为单位显示磁盘I/O速度
    iostat -n   # 显示网络设备的统计信息
    iostat -x   # 显示详细的磁盘I/O统计信息
    ```

    通过iostat命令,可以实时监视系统的磁盘I/O性能,帮助用户了解磁盘的读写速度、CPU的利用率和I/O等待时间等关键指标,从而进行性能分析和优化。

    使用时需要安装,iostat 命令是 sysstat 包的一部分,所以你需要安装 sysstat 包才能使用 iostat 命令-yum install sysstat

    网络状态监控

     四、crontab系统定时任务

    crond服务

    crond是Linux系统中的一个守护进程,用于执行定时任务。它会根据预定的时间表(通常是crontab文件)来执行指定的命令或脚本。crond服务在系统启动时会自动启动,并持续运行,不受用户登录和注销的影响。

    crond服务的主要功能包括:

    1. 定时任务调度:crond服务会周期性地检查系统中的crontab文件,根据其中定义的时间表来执行相应的命令或脚本。时间表可以指定具体的日期和时间,也可以使用通配符来表示一段时间范围。
    2. 任务管理:crond服务可以管理多个定时任务,它会根据任务的优先级和时间表来确定任务的执行顺序。同时,crond还提供了一些管理命令,如查看当前正在运行的任务、停止指定任务等。
    3. 日志记录:crond服务会将执行的任务和相关的日志记录到系统日志文件中,方便用户查看和排查问题。
    4. 灵活配置:crond服务可以通过配置文件进行灵活的定制,可以设置任务的时间表、执行的命令、输出的日志等。

    crond服务的配置文件主要有两个:

    1. /etc/crontab:系统级的crontab文件,用于定义系统范围内的定时任务。该文件的格式与普通的crontab文件略有不同,需要指定任务的执行者(用户)。
    2. /var/spool/cron/:用户级的crontab文件存放目录,每个用户可以在该目录下创建自己的crontab文件,用于定义个人的定时任务。

    使用crond服务时,可以使用以下命令进行管理:

    - `service crond start`:启动crond服务。
    - `service crond stop`:停止crond服务。
    - `service crond restart`:重启crond服务。
    - `service crond status`:查看crond服务的运行状态。
    - `crontab -e`:编辑当前用户的crontab文件。
    - `crontab -l`:列出当前用户的crontab文件的内容。
    - `crontab -r`:删除当前用户的crontab文件。

    通过配置和管理crond服务,可以实现定时执行任务的需求,如备份数据、定时清理日志、定时发送邮件等。这对于系统管理和自动化任务非常有用。

     crontab命令

    配置文件说明 

    特殊符号 

     举例

  • 相关阅读:
    浅谈C++函数
    ISC技术分享:从RASP开启云上应用安全防护
    【博客451】OVN中的Logical Flow 与 Open Flow
    对讲机在未来会有更好的发展吗?
    python基础查漏补缺
    route/router区别/参数
    【数据结构与算法】时间复杂度和空间复杂度
    电源硬件设计----线性调压器与LDO
    2022最新IntellJ IDEA的zheng开发部署文档
    929903-87-7,Ac-Arg-Leu-Arg-MCA
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/133632804