1 Linux进程管理
1.1 什么是程序
- 程序是保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合。
- 程序是一串没有运行的代码
1.2 什么是进程
- 狭义定义:
- 进程是正在运行的程序的实例。
- 广义定义:
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
- 它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
- 在 Linux 操作系统中,每个程序启动后可以创建一个或多个进程。
- 例如,提供 Web 服务的httpd 程序,当有大量用户同时访问Web 页面时,httpd 程序可能会创建多个进程来提供服务。
1.3 什么是线程
- 线程(Thread)是进程的组成部分,是程序执行的最小单位。
- 一个进程可以包含多个线程,这些线程共享进程的资源,如内存空间和文件句柄。
- 线程拥有自己的执行栈和局部变量,但访问进程的全局变量。由于多个线程可以并发执行,它们能够在同一进程内执行不同的任务,从而实现程序的高效并发运行。线程可以在不同的处理器上并行执行,从而提高程序的运行速度和响应性。
1.4 线程和进程的区别
- 进程包括线程
- 一个进程可以包含多个线程,但是一个线程只能在一个进程里面,但是一个进程里面至少都要有一个线程。
- 基本单位不同
- 进程是“资源分配”的基本单位
- 线程是“调度执行”的基本单位。
- 资源分配不同
- 一个进程拥有一份内存资源,每个进程拥有的内存资源都各自一份。
- 但是同一个进程里面的线程是共用一份内存资源的,所以是多个线程用一份资源。
1.5 查看进程
1.5.1 ps命令
- 查看静态的进程统计信息(Processes Statistic)
- ps 命令是 Linux 操作系统中最为常用的进程查看工具,主要用于显示包含当前运行的各进程完整信息的静态快照。
- 语法:ps [选项]
- 常用选项:
- a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
- u:使用以用户为主的格式输出进程信息
- x:显示当前用户在所有终端下的进程信息
- -e:显示系统内的所有进程信息
- -l:使用长(Long)格式显示进程信息
- -f:使用完整的(Full)格式显示进程信息
- 通常会将选项组合在一起使用,如执行
ps aux
或ps -elf
命令
1.5.1.1 ps aux
- 执行
ps aux
命令后,将以简单列表的形式显示出进程信息
- 第一行为列表标题,其中各字段的含义描述如下:
- USER:启动该进程的用户账号的名称
- PID:该进程在系统中的数字ID号,在当前系统中是唯一的
- %CPU:CPU 占用的百分比
- %MEM:内存占用的百分比
- VSZ:占用虚拟内存(swap 空间)的大小
- RSS:占用常驻内存(物理内存)的大小
- TTY:表明该进程在哪个终端上运行,“?”表示未知或不需要终端
- STAT:显示进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应该予以手动终止。
- START:启动该进程的时间
- TIME:该进程占用的CPU时间
- COMMAND:启动该进程的命令的名称
1.5.1.2 ps -elf
- 执行
ps -elf
命令,将以长格式显示系统中的进程信息,并且包含更丰富的内容。 - 例如,输出信息中还包括PPID列(表示对应进程的父进程的 PID 号)
- 第一行为列表标题,其中各字段的含义描述如下:
- F:内核分配给进程的系统标记
- S:进程的状态
- UID:启动这些进程的用户
- PID:进程的进程ID
- PPID:父进程的进程号(如果该进程是由另一个进程启动的)
- C:进程生命周期中的CPU利用率
- PRI:进程的优先级(越大的数字代表越低的优先级)
- NI:谦让度值用来参与决定优先级
- ADDR:进程的内存地址
- SZ:假如进程被换出,所需交换空间的大致大小
- WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
- STIME:进程启动时的系统时间
- TTY:进程启动时的终端设备
- TIME:运行进程需要的累计CPU时间
- CMD:进程的启动命令
1.5.1.3 ps
- 直接执行
ps
命令,只显示当前用户会话中打开的进程
- 由于系统中运行的进程数量较多,需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤。
- ps aux | grep systemd
- 显示指定用户信息
- ps -u root
1.5.2 僵尸(死)进程
- 在 Linux 系统中,僵尸进程(ZombieProcess)是一种已经执行完毕并被其父进程等待(通过wait()或waitpid() 系统调用)的系统进程。
- 尽管这些进程已经完成了它们的执行,它们仍然在进程表中保留一个条目,因为它们需要保留一些信息(例如退出状态和终止信号),以便其父进程可以通过调用wait() 来获取这些信息。
- 僵尸进程的成因
- 父进程未及时回收:当一个子进程结束时,内核会保留该子进程的一些信息(例如退出状态),直到父进程通过wait() 或 waitpid() 系统调用来获取这些信息。如果父进程没有及时回收子进程,这些信息就会一直保留在系统中,形成僵尸进程。
- 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程。
- 僵尸进程的处理
- 忽略僵尸进程:在某些情况下,如果你确信僵尸进程不会占用太多资源或不会对系统造成问题,可以忽略它们。但通常不推荐这样做,除非你能确保它们的行为。
- 使用工具监控和清理:可以使用一些工具如ps,、top、pstree 来监控僵尸进程,并使用kill 命令发送SIGCHLD信号给特定的僵尸进程的父进程,或者简单地重启服务来清理僵尸进程。
- 查找僵尸进程:ps aux | grep Z
- 确保系统不会产生大量的僵尸进程,因为它们会占用一定的系统资源,虽然通常不会对系统性能产生直接影响,但过多的僵尸进程可能会影响系统的稳定性和可管理性。
1.5.3 top命令
- 使用 ps 命令查看到的是一个静态的进程信息,并不能连续地反馈出当前进程的运行状态。
- 若希望以动态刷新的方式显示各进程的状态信息,可以使用 top 命令。
- top 命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒钟刷新一次,其作用基本类似于Windows 操作系统中的任务管理器。
- 语法:top [选项]
- 常用选项:
- -d <秒数>:指定 top 命令的刷新时间间隔,单位为秒,默认为3秒
- -n <次数>:指定 top 命令运行的次数后自动退出
- -p <进程ID>:仅显示指定进程ID的信息
- -u <用户名>:仅显示指定用户名的进程信息
- -H:在进程信息中显示线程详细信息
- -i:不显示闲置(idle)或无用的进程
- -b:以批处理(batch)模式运行,直接将结果输出到文件
- -c:显示完整的命令行而不截断
- -S:累计显示进程的 CPU 使用时间
1.5.3.1 各项信息描述
- top(任务队列消息)
- 09:17:39 系统时间
- up 8:19 系统已运行时长
- 2 users 当前登录用户数
- load average: 0.03, 0.01, 0.00 系统负载,即单位时间内系统处理的任务数,后面三个数值分别为1分钟、5分钟、15分钟前到现在的平均值
- Tasks(系统任务信息)
- total,总进程数
- running,正在运行的进程数
- sleeping,休眠的进程数
- stopped,中止的进程数
- zombie,僵死无响应的进程数
- %Cpu(s)(CPU 占用信息)
- us,用户占用
- sy,内核占用
- ni,优先级调度占用
- id,空闲CPU
- wa,I/O 等待占用
- hi,硬件中断占用
- si,软件中断占用
- st,虚拟化占用
- 要了解空闲的 CPU 百分比,主要看%id部分
- MiB Mem(内存占用信息)
- total,总内存空间
- free,空闲内存
- used,已用内存
- buff/cache,物理内存和交换内存的缓冲区总和
- MiB Swap(交换空间占用)
- total,总交换空间
- free,空闲交换空间
- used,已用交换空间
- avail Mem,可用物理空间
- 进程信息区各列说明
- PID 进程id
- USER 进程所有者的用户名
- PR 优先级–系统优先级ØNI 谦让度值。负值表示高优先级,正值表示低优先级 --人为设置的优先级
- VIRT 进程使用的虚拟内存总量,单位kb
- RES 进程使用的物理内存大小,单位kb
- SHR 共享内存大小,单位kb
- S 进程状态
- %CPU 上次更新到现在的CPU时间占用百分比
- %MEM 进程使用的物理内存百分比
- TIME+ 进程使用的CPU时间总计,单位1/100秒
- COMMAND 命令名/命令行
1.5.3.2 功能和交互操作
- 在 top 命令的全屏操作界面中
- 按M键根据内存占用情况进行排序,
- 按 N 键根据启动时间进行排序
- 按h键可以获得 top程序的在线帮助信息
- 按q键可以正常地退出top 程序
1.5.4 pgrep命令
- 当使用 ps 命令查询某个进程的PID信息时,往往需要结合 grep 命令对输出结果进行过滤,但这样使用非常不方便,而 pgrep 命令正是查询特定进程信息的专用工具。
- 使用 pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特定进程的PID号
- 通过 pgrep 命令,可以只指定进程的一部分名称进行查询,结合“-l”选项可同时输出对应的进程名(否则只输出 PID 号,不便于理解)。
- pgrep -l “log”
- 结合“-U”选项查询特定用户的进程、“-t”选项查询在特定终端运行的进程。
- pgrep -l -U teacher -t tty2
1.5.5 pstree 命令
- pstree 命令可以输出Linux 操作系统中各进程的树形结构,以更加直观地判断各进程之间的相互关系(父进程、子进程)。
- pstree(英文全称:display a tree of processes))命令将所有进程以树状图显示,树状图将会以pid(如果有指定) 或是以 init 这个基本进程为根(root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的进程。
- 语法:pstree [选项]
- 常用选项:
- -a 显示该进程的完整指令及参数, 如果是被记忆体置换出去的进程则会加上括号
- -c 如果有重覆的进程名, 则分开列出(预设值是会在前面加上*)
- -p 可以同时列出对应的 PID 号
- -u 可以列出对应的用户名
- 示例
# 查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息
pstree -aup
# 列出由用户root打开的进程及子进程的树结构
pstree -ap root
# 查看进程所属的线程,只显示线程
pstree -p 1
# 查看进程所属的线程,同时显示线程的用户
pstree -up 1
2 计划任务
在 Linux 操作系统中,可以由用户手工启动或者按预订计划调度启动新的进程。
- 手工启动进程
- 由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。
- 根据该进程是否需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。
- 进程在前台运行(如执行“ls -l”命令)时,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台启动运行。
- 进程在后台运行时,用户可以继续在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。启动后台进程需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后会直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。
- 例如,当使用 cp 命令从光盘中制作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合“&”符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作:
- cp /dev/cdrom mycd.iso &
- 调度启动进程
- 在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份),这些任务更适合在相对空闲的时候(如夜间)进行。这时就需要用户事先进行调度安排,指定任务运行的时间,当系统到达设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。
- 进程的调度启动可以通过 at、crontab 命令进行设置,其中at命令用于设置一次性(如12:15 时重启网络服务)计划任务,crontab 命令用于设置周期性运行(如每周五17:30备份数据库)的计划任务。
2.1 at命令
- 在一个指定的时间执行一个指定任务,只能执行一次需要开启atd进程
- 安装:apt install at
- 查看:ps -ef | grepatd
- 开启:/etc/init.d/atd start or restart
- 开机即启动则需要运行:chkconfig --level 2345 atdon
- 语法:at [参数] [时间]
- 时间格式
- 绝对时间:HH:MM(如 14:30)或 YYYY-MM-DD HH:MM(如 2024-12-05 14:30)
- 相对时间:now + 5 minutes、tomorrow、next friday
- 自然语言:noon(中午)、midnight(午夜)
2.1.1 示例
# 直接执行,三天后的下午5点
echo 123456 > 1.txt | at 5pm + 3 days
# 直接执行,明天17点钟
echo 123456 > 2.txt | at 17:30 tomorrow
# 交互执行,11:30
at 11:30
echo 111111111 > 3.txt
sleep 60
echo 222222222 >> 3.txt
sleep 60
echo 333333333 >> 3.txt
2.1.2 退出at
- 使用Ctrl+C组合键:按下**Ctrl+C键可以中断当前正在运行的命令**。当你在终端上运行at命令后,如果需要提前退出,可以使用Ctrl+C组合键中断该命令的执行。
- 使用Ctrl+D组合键:按下**Ctrl+D键可以表示输入结束**,从而退出at命令。在终端上运行at命令后,如果需要提前退出,可以按下Ctrl+D组合键,表示输入结束,然后at命令会立即停止。
2.1.3 查询
# 查询系统还没有执行完成的任务
atq
2.1.4 删除
# 删除已经设置但还没执行的任务
atrm 4
2.2 crontab命令
- Linux crontab 是Linux 系统中用于设置周期性被执行的指令的命令。
- 当安装完成操作系统之后,默认便会启动此任务调度命令。
- crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。
- 注意:新创建的 cron 任务,不会马上执行,至少要过2 分钟后才可以,当然你可以重启cron来马上执行。
- Linux 任务调度的工作主要分为以下两类
- 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
- 个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
- 语法:crontab [选项] 文件
- 常用选项
- -u user:设定指定 user 的时程表
- 前提是要有该用户的权限,比如root用户
- 不使用该选项,表示设定当前用户自己的时程表
- -e:执行文字编辑器来设定时程表
- -l:列出目前的时程表
- -r:删除目前的时程表
- -u user:设定指定 user 的时程表
2.2.1 常用命令
# 查看当前用户的 crontab 文件
crontab -l
# 编辑当前用户的 crontab 文件
crontab -e
# 删除当前用户的 crontab 文件
crontab -r
# 列出某个用户的 crontab 文件(需要有相应的权限)
crontab -u username -l
# 编辑某个用户的 crontab 文件(需要有相应的权限)
crontab -u username -e
2.2.2 crontab -e命令
- 执行“crontab -e”命令后,将打开计划任务编辑界面(与 vi 中的操作相同)。
- 通过该界面用户可以自行添加具体的任务配置,每行代表一个记录,配置的格式与/etc/crontab文件中的主体部分类似。
- 每一行任务配置记录都包括六个数据字段,分别表示不同的含义
* | * | * | * | * | command |
---|---|---|---|---|---|
分 | 时 | 日 | 月 | 周 | 执行的命令或脚本 |
0~59 | 0~23 | 1~31 | 1~12 | 0~6 |
- 除了“*”以外,还可以使用“-”(减号)、“,”(逗号)、“/”(斜杠)与数字构成表达式来表示较复杂的时间关系。
- 减号“-”:可以表示一个连续的时间范围,如“1-4”表示整数 1、2、3、4。
- 逗号“,”:可以表示一个间隔的不连续范围,如“3,4,6,8”。
- 斜杠符号“/”:可以用来指定间隔频率,如在日期字段中的“*/3”表示每隔 3 天。
- 示例
# 每天早上7:50自动开启 sshd 服务,22:50关闭sshd服务
50 7 * * * /usr/bin/systemctl start sshd.service
50 22 * * * /usr/bin/systemctl stopsshd.servic
# 每隔五天清空一次 FTP 服务器公共目录/var/ftp/pub中的数据
0 0 */5 * * /usr/bin/rm-rf /var/ftp/pub/*
# 每周六的 7:30 重新启动系统中的httpd服务
30 7 * * 6 /usr/bin/systemctl httpd restart
# 每周一、周三、周五的下午17:30,使用tar 命令自动备份/etc/httpd 目录
30 17 * * 1,3,5 /usr/bin/tar jcf httpdconf.tar.bz2 /etc/httpd/
- 普通用户执行“crontab -e”命令时,可以设置自己的计划任务(需要注意命令的执行权限)。
- 因各条计划任务在执行时并不需要用户登录,所以任务配置记录中的命令建议使用绝对路径,以避免因缺少执行路径而无法执行命令的情况。
- ls–> /usr/bin/ls
2.2.3 查看用户的计划任务列表
- crontab 命令结合“-l”选项可以,对于 root 用户来说,还可以结合“-u”选项。
# 查看当前用户的计划任务列表
crontab -l
# root用户可以查看其他用户的计划任务
crontab -l -u zzh
2.2.4 删除用户的计划任务列表
# 删除某一条计划任务
crontab -e
# 清空当前用户的所有计划任务
crontab -r
2.2.5 示例
# 每隔1分钟,ls一次根目录下的文件,并将其输出到/logfile.txt
crontab -e
* * * * * ls / >> /logfile.txt
# 查看计划任务
crontab -l
# 通过cron日志,相关信息查看
grep CRON /var/log/syslog
grep CRON /var/log/cron
# 删除用户所有计划任务
crontab -e
# 查看计划任务
crontab -l