进程
进程是指已启动的可执行程序的运行中实例,进程的环境主要包括:本地和全局变量、当前调度上下文、分配的系统资源,如文件描述符和网络端口等。
进程的组成部分:分配的地址空间、安全属性(如所有权凭据和特权)、程序代码的一个或多个线程,进程状态
进程是可以创建子进程的,采用 fork 的方式,每一个新进程都有唯一的 PID。
所有进程都是第一个系统进程的后代,在红帽 Linux 8 系统上,第一个系统进程是 systemd。
通过 fork 例程,子进程继承安全性身份,过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码,随后子进程可能 执行自己的程序代码。
通常,父进程在子进程运行期间处于睡眠状态,当子进程退出时,父进程会收到信号,而被唤醒,开始清理子进程资源,然后再执行自己的代码。
Linux进程状态
| 名称 | 标志 | 内核定义的状态和描述 |
|---|---|---|
| 运行 | 红 | TASK_RUNNING: 进程正在 CPU 上执行或正在等待运行。 |
| 睡眠 | S | TASK_INTERRUPTIBLE: 进程正在等待某一条件,若事件或信号满足条件,该进程返回到运行中 |
| D | TASK_UNINTERRUPTIBLE: 此进程也在睡眠,但与 S 状态不太,不会响应信号,仅在进程中断可能会导致意外设备的情况下使用 | |
| K | TASK_KILLABLEL: 与不可中断的 D 状态相同,但有所修改,允许等待中的任务响应要被中断的信号。实用程序中通常将可中断的进程显示为 D 状态 | |
| I | TASK_REPORT_IDLE: D 状态的子集,计算负载均衡时,不会统计这些信息 | |
| 已停止 | T | TASK_STOPPED: 进程已被停止(暂停), 通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复) |
| T | TASK_TRACED: 正在被调试的进程也会临时停止,并且共享同一个 T 状态标志 | |
| 僵停 | Z | EXIT_ZOMBLE: 子进程在退出时向父进程发出信号,除进程身份(PID) 之外的所有资源均已释放 |
| X | EXIT_DEAD: 当父进程清理(获取) 剩余的子进程结构时,子进程现在已经彻底释放 此状态不会再进程列出实用程序中看到 |
查看进程信息
通过 top 命令可以查看每个进程的状态(动态展示)。想退出需要按 q 键。
通过 ps 命令可以查看每个进程的状态,一般搭配 aux 或 -aux 使用 (当前静态)。
控制作业
作业控制是 shell 的一种功能,允许单个 shell 实例运行和管理多个命令。
作业可以认为是一组命令的集合,当然一条命令,也可以理解成一个作业。
如果需要作业在后台运行,那么只需要在命令行的结尾处加上 符号 & 即可。
如果需要后台进程,变成前台进程,我们一般会先使用 jobs 进行查询,在使用 fg %job-number 进行切换。
当前台进程卡住或者一直在执行(总之就是无法输入了),可以 Ctrl + Z 进行暂停,再使用 bg 命令使其再后台进行。或者选择 Ctrl + C 终止当前进程。