一、Linux进程管理
进程是程序在计算机中的一次运行实例,是操作系统资源分配和调度的基本单位。Linux系统中,进程拥有唯一的PID(Process ID),通过对进程的管理可实现系统资源优化、故障排查等功能。
1.1 进程的状态
Linux进程存在以下几种核心状态,可通过命令查看进程状态及切换逻辑:
-
R(运行态):进程正在CPU上运行,或处于就绪队列中等待CPU调度,是动态执行的状态。
-
S(可中断睡眠态):进程因等待资源(如IO、信号)而暂停运行,当资源就绪或收到中断信号时可被唤醒。默认情况下,后台进程多处于此状态。
-
D(不可中断睡眠态):进程深度睡眠,等待关键资源(如磁盘IO),此时无法被信号中断,只能等待资源就绪后自行唤醒,强行终止可能导致数据丢失。
-
Z(僵尸态):进程已终止,但父进程未回收其资源(PID、退出状态等),此时进程仅残留少量信息在进程表中,需通过回收父进程或重启系统清除。
-
T(停止态):进程被信号暂停(如Ctrl+Z),可通过信号恢复运行或彻底终止。
1.2 进程管理常用命令
1.2.1 查看进程
ps:查看当前进程快照
基础用法:ps aux(最常用),显示系统中所有进程的详细信息。
-
a:显示所有终端相关进程;
-
u:以用户为中心显示进程信息(用户名、CPU占用率等);
-
x:显示无终端关联的进程(如后台服务)。
筛选用法:结合管道符| grep 关键词,如ps aux | grep nginx,查看nginx相关进程。
格式化输出:ps -ef,以标准格式显示进程(PPID父进程ID、PID、进程命令等),便于查看进程树关系。
top:实时监控进程动态
基础用法:直接输入top,进入实时监控界面,默认每3秒刷新一次。
核心界面信息:
-
第一行:系统负载(1分钟、5分钟、15分钟平均负载,值越接近CPU核心数越满);
-
第二行:进程总数(总进程数、运行态、睡眠态、僵尸态数量);
-
第三行:CPU占用率(us用户态、sy内核态、ni优先级调整占用、id空闲率等);
-
第四、五行:内存/交换分区使用情况(total总容量、used已使用、free空闲、buff/cache缓存占用)。
交互操作(界面内输入):
-
P:按CPU占用率降序排序;
-
M:按内存占用率降序排序;
-
k:终止指定PID的进程;
-
q:退出top界面。
pstree:以树状图显示进程关系
基础用法:pstree,直观展示父进程与子进程的层级关系;
扩展用法:pstree -p,显示进程树并标注每个进程的PID。
pgrep:通过名称快速查找进程PID
用法:pgrep nginx,直接返回所有nginx进程的PID;
扩展:pgrep -l nginx,同时显示PID和进程名称。
1.2.2 控制进程
启动进程
前台启动:直接输入命令,如nginx,进程占用当前终端,需按Ctrl+C终止;
后台启动:命令后加&,如nginx &,进程在后台运行,终端可继续执行其他命令;
脱离终端启动:使用nohup命令,如nohup ./test.sh &,即使关闭终端,进程仍继续运行,输出日志默认写入nohup.out文件。
暂停与恢复进程
暂停进程:前台进程按Ctrl+Z,或使用命令kill -STOP PID;
恢复进程:后台恢复为前台fg 作业号,保持后台运行bg 作业号(作业号可通过jobs命令查看)。
终止进程
kill PID:发送默认信号(15号SIGTERM)终止进程,进程有时间清理资源(优雅终止);
kill -9 PID:发送9号信号(SIGKILL)强制终止进程,无清理过程,适用于无法正常终止的进程;
killall 进程名:按进程名称终止所有对应进程,如killall nginx,避免逐个查找PID;
pkill 进程名:与killall类似,通过名称终止进程,如pkill -9 mysql。
1.2.3 进程优先级调整
Linux通过nice值调整进程优先级,nice值范围为-20(最高优先级)~19(最低优先级),默认nice值为0。优先级越高,进程获得CPU调度的概率越大。
启动时指定优先级:nice -n 优先级值 命令,如nice -n 5 ./test.sh &,以nice值5启动后台进程;
调整已运行进程优先级:renice 新优先级值 PID,如renice -10 1234,将PID为1234的进程优先级提升至-10(需root权限调整负nice值)。
二、Linux计划任务管理
计划任务用于按预设时间自动执行命令或脚本,Linux中提供两种核心工具:at用于执行一次性任务,crontab用于执行周期性任务,分别适用于不同场景,可满足临时调度、定时重复执行等需求。
2.1 at一次性任务
at工具用于安排在未来某个特定时间执行一次命令或脚本,执行完成后任务自动终止,无需手动清理,适用于临时备份、定时提醒、一次性系统操作等场景。at任务依赖atd服务运行,系统默认启用。
注意:atd服务需保持运行,可通过systemctl status atd查看状态,systemctl start atd启动服务;普通用户是否能使用at,由/etc/at.allow和/etc/at.deny文件控制(allow优先级更高)。
2.1.1 at命令用法
创建at任务: 基础格式:at 时间,输入后进入交互模式,输入要执行的命令/脚本,按Ctrl+D结束编辑(确认创建任务)。
时间指定方式: 绝对时间:at 14:30 2026-02-10(2026年2月10日14点30分执行);
相对时间:at now + 10 minutes(10分钟后执行)、at now + 2 hours(2小时后执行)、at now + 1 day(1天后执行);
模糊时间:at midnight(午夜12点)、at noon(中午12点)、at tomorrow(明天当前时间)。
非交互创建:结合echo命令,如echo "/home/user/backup.sh" | at 22:00(无需进入交互模式,直接创建22点执行备份脚本的任务)。
查看at任务: at -l(等同于atq):显示当前用户的所有待执行at任务,包含任务ID、执行时间、用户名;
at -c 任务ID:查看指定ID的at任务详情(包括执行命令、环境变量等)。
删除at任务: at -d 任务ID(等同于atrm 任务ID):删除指定ID的at任务;
示例:atrm 5(删除ID为5的at任务)。
2.1.2 at任务示例
1小时后执行日志清理脚本:at now + 1 hour,交互模式输入/home/user/clean_log.sh,按Ctrl+D确认;
明天早上8点执行系统更新:echo "yum update -y" | at 8:00 tomorrow(需root权限);
2026年2月15日20点执行文件归档:at 20:00 2026-02-15,交互模式输入tar -zcf /home/user/files.tar.gz /home/user/docs。
2.1.3 at任务注意事项
-
环境变量:at任务执行时环境变量可能与终端不同,脚本中建议使用绝对路径和完整环境变量(可通过source /etc/profile加载系统环境变量);
-
输出处理:默认情况下,at任务执行结果会以邮件形式发送给创建者,可通过重定向输出到文件,如echo "/home/user/test.sh > /home/user/at_result.log 2>&1" | at 15:00;
-
权限控制:/etc/at.allow文件中列出的用户可使用at,/etc/at.deny列出的用户不可使用(若两个文件都不存在,仅root可使用)。
2.2 crontab周期性任务
crontab依赖crond服务运行,系统默认启动并常驻后台。用户通过crontab命令创建、编辑计划任务,任务配置存储在对应用户的配置文件中(/var/spool/cron/用户名),系统定期读取配置并执行任务,适用于日志切割、每日备份、定期统计等周期性场景。
注意:crond服务需保持运行,可通过systemctl status crond查看状态,systemctl start crond启动服务。
计划任务用于按预设时间自动执行命令或脚本,Linux中常用crontab工具实现周期性任务调度,适用于日志切割、数据备份、定时执行脚本等场景。
2.1 crontab基础原理
crontab依赖crond服务运行,系统默认启动并常驻后台。用户通过crontab命令创建、编辑计划任务,任务配置存储在对应用户的配置文件中(/var/spool/cron/用户名),系统定期读取配置并执行任务。
注意:crond服务需保持运行,可通过systemctl status crond查看状态,systemctl start crond启动服务。
2.2 crontab命令用法
查看计划任务:crontab -l,显示当前用户的所有计划任务;
编辑计划任务:crontab -e,进入vim编辑器编写任务(首次使用需选择编辑器);
删除计划任务:crontab -r,删除当前用户的所有计划任务(谨慎使用);
指定用户管理任务:root用户可通过crontab -u 用户名 -l/-e/-r,管理其他用户的计划任务。
2.3 计划任务配置格式
crontab任务配置一行对应一个任务,格式如下(5个时间字段+1个命令/脚本字段):
分钟 小时 日 月 星期 命令/脚本路径
2.3.1 时间字段说明
-
分钟:0~59,代表每小时的第几分钟执行;
-
小时:0~23,代表每天的第几小时执行(24小时制);
-
日:1~31,代表每月的第几号执行;
-
月:1~12,代表每年的第几月执行;
-
星期:0~7(0和7均代表周日),代表每周的星期几执行。
2.3.2 特殊符号用法
-
*(星号):表示匹配该字段的所有值,如分钟字段为*,代表每分钟执行;
-
,(逗号):表示指定多个不连续的值,如小时字段为8,12,18,代表8点、12点、18点执行;
-
-(横杠):表示指定连续的范围,如日字段为1-5,代表每月1号至5号执行;
-
/(斜杠):表示间隔时间,如分钟字段为*/5,代表每5分钟执行;小时字段为0-23/2,代表每2小时执行。
2.3.3 配置示例
每5分钟执行一次脚本:*/5 * * * * /home/user/test.sh;
每天凌晨2点执行备份脚本:0 2 * * * /home/user/backup.sh;
每周日上午10点30分执行日志清理:30 10 * * 0 /home/user/clean_log.sh;
每月1号、15号下午3点执行数据库优化:0 15 1,15 * * /home/user/db_optimize.sh;
工作日(周一至周五)晚上8点执行统计脚本:0 20 * * 1-5 /home/user/stat.sh。
2.4 计划任务注意事项
路径问题:脚本中需使用绝对路径(如/usr/bin/ls而非ls),避免因crontab环境变量不全导致命令执行失败;
权限问题:执行脚本的用户需拥有脚本及目标文件的读写执行权限,敏感操作建议使用root用户配置;
输出重定向:默认情况下,crontab任务执行结果(stdout/stderr)会发送到当前用户邮箱,可通过重定向输出到文件,如0 2 * * * /home/user/backup.sh > /home/user/backup.log 2>&1(2>&1表示将错误输出合并到标准输出);
特殊时间避免冲突:避免在系统负载高峰(如凌晨0点-2点,系统自动更新、日志切割时段)配置大量密集任务;
测试验证:新配置任务后,可手动执行脚本测试是否正常运行,同时查看crontab日志(/var/log/cron)排查执行异常。
三、常见问题排查
3.1 进程相关问题
僵尸进程过多:通过ps aux | grep Z查看,排查父进程是否异常,若父进程无响应,可终止父进程(kill -9 父进程PID),让init进程(PID=1)回收僵尸进程;
CPU占用过高:通过top命令按P排序,定位高CPU进程,分析进程是否异常(如死循环),必要时终止进程或优化程序;
内存占用过高:top命令按M排序,查看进程内存使用情况,若为内存泄漏,需修复程序,临时可终止进程释放内存。
3.2 计划任务相关问题
任务未执行:
检查crond服务是否运行:systemctl status crond;
查看crontab日志:tail -f /var/log/cron,排查任务执行报错;
验证脚本路径、权限及手动执行结果。
任务执行结果异常:检查脚本中环境变量、文件路径是否正确,将输出重定向到日志文件,通过日志定位报错信息。




