Linux 进程管理与计划任务详解
Linux 进程管理与计划任务详解
一、程序与进程的基本概念
- 程序:保存在外部存储介质中的可执行机器代码和数据的静态集合,是静态的文件实体
- 进程:在 CPU 及内存中处于动态执行状态的计算机程序,是程序的动态执行实例
- 关联关系:每个程序启动后可创建一个或多个进程,进程随程序启动而产生,随执行结束而消亡
二、进程查看工具
1. ps
:查看静态进程信息
用于捕捉某一时刻的进程快照,常用选项及功能如下:
选项组合 | 功能描述 |
---|---|
-a | 显示当前终端下的所有进程(包括其他用户) |
-u | 以用户为主的格式输出进程信息 |
-x | 显示当前用户所在终端的进程信息(与-a 结合显示系统所有进程) |
-e | 显示系统内所有进程信息 |
-l | 以长格式显示进程信息 |
-f | 以完整格式显示进程信息 |
ps输出字段说明:
字段 | 含义 |
---|---|
USER | 启动进程的用户账号名称 |
PID | 进程在系统中的唯一数字 ID 号 |
%CPU | CPU 占用百分比 |
%MEM | 内存占用百分比 |
VSZ | 占用虚拟内存(swap 空间)的大小 |
RSS | 占用常驻内存(物理内存)的大小 |
TTY | 进程运行的终端(“?” 表示未知或无需终端) |
STAT | 进程状态(S 休眠、R 运行、Z 僵死、< 高优先级、N 低优先级等) |
START | 进程启动时间 |
TIME | 进程占用 CPU 的时间 |
COMMAND | 启动进程的命令名称 |
2. top
:查看进程动态信息
实时监控进程资源占用,动态刷新进程状态(默认 3 秒 / 次),核心信息如下:
(1)系统负载信息
load average
:CPU 平均负载,依次为 1 分钟、5 分钟、15 分钟内的平均值。若 5 分钟或 15 分钟负载值超过 CPU 核心数的 2 倍,系统处于高负载状态
(2)进程状态统计(task)
状态 | 含义 |
---|---|
total | 总进程数 |
running | 正在运行的进程数 |
sleeping | 休眠状态的进程数 |
stopped | 停止状态的进程数 |
zombie | 僵死状态的进程数 |
(3)CPU 占用信息(% cpu)
指标 | 含义 |
---|---|
us | 用户进程占用 CPU 时间的百分比 |
sy | 系统进程占用 CPU 时间的百分比 |
ni | 优先级调整后的用户进程占用 CPU 百分比 |
id | 空闲 CPU 的百分比 |
wa | I/O 等待占用 CPU 时间的百分比 |
hi | 硬件中断占用 CPU 时间的百分比 |
si | 软件中断占用 CPU 时间的百分比 |
st | 虚拟化环境中被占用的 CPU 时间百分比 |
(4)进程详细字段(top
输出)
字段 | 含义 |
---|---|
PID | 进程 ID |
USER | 进程属主名称 |
PR | 进程优先级 |
NI | 进程 nice 值(-20~+19,值越小优先级越高) |
VIRT | 占用虚拟内存总量(kb) |
RES | 占用物理内存总量(kb) |
SHR | 与其他进程共享的内存总量(kb) |
S | 进程状态(D 不可中断休眠、R 运行、S 休眠、T 停止、Z 僵死) |
%CPU | 进程使用 CPU 的百分比 |
%MEM | 进程使用内存的百分比 |
TIME+ | 进程启动后占用的 CPU 总时间 |
COMMAND | 启动进程的命令名称 |
3. 其他进程查看工具
-
pgrep -l 进程名
:查看某一进程的进程号和名称(例:pgrep -l systemd
) -
pstree
:查看进程树形结构,常用选项:
-p
:同时列出对应 PID-u
:列出对应用户名-a
:列出完整命令信息
三、进程控制方法
1. 手动启动进程
- 前台启动:直接执行命令(如
ls
),进程占用当前终端 - 后台启动:命令后加
&
(如route &
),进程在后台执行,不阻塞终端
2. 进程挂起与恢复
操作 | 命令 / 快捷键 | 功能 |
---|---|---|
挂起前台进程 | Ctrl+Z | 将当前运行的前台进程调入后台并停止执行 |
查看后台进程 | jobs -l | 显示后台进程列表(含进程号和状态) |
恢复后台进程(后台运行) | bg 任务号 | 使后台暂停的进程继续在后台执行 |
恢复后台进程(前台运行) | fg 任务号 | 将后台进程调回前台执行 |
3. 终止进程
命令 | 格式 | 适用场景 |
---|---|---|
kill | kill 进程号 | 正常终止指定 PID 的进程 |
kill -9 | kill -9 进程号 | 强制终止无法正常结束的进程(慎用) |
killall | killall 进程名 | 终止所有同名进程(如killall httpd ) |
pkill | pkill -U 用户名 /pkill -t 终端 | 根据用户或终端终止特定进程 |
四、计划任务设置
1. at
:一次性任务
-
设置任务:
at 23:30 2020-11-23 # 指定执行时间 at> ls / > /tmp/a # 输入要执行的命令 at> <Ctrl+D> # 按Ctrl+D确认
-
任务管理:
atq
:查询待执行的 at 任务at -c 任务号
:查看任务具体内容atrm 任务号
:删除指定 at 任务
2. crontab
:周期性任务
(1)核心配置
- 系统配置文件:
/etc/crontab
(系统级任务) - 用户任务存放目录:
/var/spool/cron/
(用户级任务) - 时间格式:分、时、日、月、周(支持通配符:
*
任意值、*/n
每隔 n 单位、-
范围、,
列表)
(2)常用命令
命令 | 功能 |
---|---|
crontab -e | 编辑当前用户的周期性任务 |
crontab -u 用户名 -e | 编辑指定用户的周期性任务 |
crontab -l | 查看当前用户的任务列表 |
crontab -r | 删除当前用户的所有任务 |
(3)权限控制
- 通过
/etc/cron.allow
(允许创建任务的用户列表)和/etc/cron.deny
(禁止创建任务的用户列表)限制权限 - 仅
/etc/cron.allow
中列出的用户可创建任务(默认优先于cron.deny
)
五、计划任务示例解析
示例 1:为用户 natasha 配置每日定时任务
需求:每天 14:23 执行/bin/echo "RHCSA"
,仅允许 natasha 和 root 创建计划任务
步骤:
-
创建用户:
useradd natasha
-
配置任务:
crontab -u natasha -e
,添加内容:
23 14 * * * /bin/echo "RHCSA"
-
限制权限:编辑
/etc/cron.allow
,添加:
root natasha
-
重启服务:
systemctl restart crond systemctl enable crond
示例 2:每月周期性任务
需求:每月 1~5 号 14:00-17:00,每隔 10 分钟执行/bin/echo "I Love Galaxy"
配置:
crontab -e # 编辑当前用户任务
*/10 14-17 1-5 * * /bin/echo "I Love Galaxy" # 添加任务
systemctl restart crond # 重启服务使配置生效
systemctl enable crond # 设置开机自启
示例 3:工作日定时记录时间
需求:周一至周五 8:00-21:00,每 2 分钟将当前时间附加到/home/galaxy/my_first_cron_job.txt
配置:
crontab -e # 编辑任务
*/2 8-21 * * 1-5 date >> /home/galaxy/my_first_cron_job.txt # 添加任务(注意用>>追加内容)
systemctl restart crond
systemctl enable crond
六、注意事项
crontab
任务中建议使用命令绝对路径(如/bin/date
),避免环境变量问题- 追加内容用
>>
,覆盖内容用>
,根据需求选择 - 修改计划任务后需重启
crond
服务(systemctl restart crond
)使其生效 - 僵死进程(Z 状态)需及时用
kill -9
手动终止,避免资源占用