进程和计划任务管理

查看和控制进程

一  查看进程

命令功能描述常用选项 / 示例
ps查看静态进程信息ps aux(显示所有用户进程)
ps -ef(显示进程树)
top实时动态监控进程(CPU / 内存占用等)按 M 排序内存占用,按 P 排序 CPU 占用,按 q 退出
pgrep根据进程名或属性过滤进程pgrep -l firefox(显示进程名和 PID)
pstree以树形结构显示进程关系pstree -p(显示 PID)
pstree -u(显示用户)

1.ps命令——查看静态的进程统计信息

选项组合功能描述示例说明
ps aux显示所有用户的进程(BSD 风格),包括隐藏进程USER PID %CPU %MEM ...(各列含义见下文)
ps -ef显示完整格式的进程信息(System V 风格),包含父进程 PID 和命令行参数UID PID PPID C STIME ...(适合查看进程树)
ps -l显示长格式信息,包含进程状态、优先级等F S UID PID PPID C PRI ...
ps -axjf以树形结构显示进程关系,包含线程信息(需 root 权限)类似 pstree 但更详细
3. 输出字段解释

以 ps aux 为例,常见列含义:

  • USER:进程所有者
  • PID:进程 ID
  • %CPU:CPU 占用百分比
  • %MEM:内存占用百分比
  • VSZ:虚拟内存大小(KB)
  • RSS:常驻内存大小(KB)
  • TTY:终端设备(? 表示无终端)
  • STAT:进程状态(如 R 运行、S 睡眠、Z 僵死、D 不可中断睡眠)
  • START:进程启动时间
  • TIME:累计 CPU 时间
  • COMMAND:启动命令
4. 高级用法
  1. 过滤进程

    bash

    ps aux | grep firefox  # 查找包含 "firefox" 的进程
    ps -C firefox          # 直接查找名为 "firefox" 的进程
    
  2. 按字段排序

    bash

    ps -eo pid,user,%mem --sort=-%mem  # 按内存占用降序排序
    
  3. 结合 awk 处理输出

    bash

    ps -eo pid,command | awk '$1 > 1000 {print $0}'  # 显示 PID > 1000 的进程
    

2.top命令——查看进程动态信息

界面结构

plaintext

top - 15:30:45 up 1 day,  2:15,  2 users,  load average: 0.34, 0.45, 0.47
Tasks: 200 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.0 us,  0.5 sy,  0.0 ni, 98.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7932.8 total,   1234.5 free,   4567.2 used,   2131.1 buff/cache
MiB Swap:  4096.0 total,  4096.0 free,      0.0 used.   3456.7 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 root      20   0   4096M  1024M   200M S   5.0   13.0   0:02.34 firefox

各部分含义

  1. 系统摘要

    • load average:1/5/15 分钟平均负载(理想值 < CPU 核心数)。
    • Tasks:总任务数、运行中、睡眠、停止、僵死进程数。
    • %Cpu(s):CPU 使用百分比(us 用户态,sy 内核态,id 空闲)。
    • Mem/Swap:内存和交换分区使用情况。
  2. 进程列表

    • PID:进程 ID。
    • USER:进程所有者。
    • PR:优先级(数值越小优先级越高)。
    • NI:nice 值(调整优先级,范围 -20 ~ 19,负值优先级更高)。
    • VIRT/RES/SHR:虚拟内存 / 常驻内存 / 共享内存。
    • S:进程状态(R 运行,S 睡眠,D 不可中断睡眠,Z 僵死)。
    • %CPU/%MEM:实时 CPU 和内存占用率。
    • TIME+:累计 CPU 时间(格式为 DD:HH:MM:SS)。
3. 常用交互命令
按键功能描述
M按内存占用排序(默认按 CPU)
P按 CPU 占用排序
T按累计 CPU 时间排序
k终止进程(输入 PID 后按回车,默认发送 SIGTERM 信号)
r调整进程优先级(输入 PID 后输入 nice 值)
h显示帮助文档
1显示每个 CPU 核心的使用率
H显示线程(默认显示进程)
q退出 top
4. 高级用法
  1. 自定义显示字段

    bash

    top -o %MEM  # 按内存排序启动
    top -f       # 选择显示的列(按 `f` 后移动光标选择字段)
    
  2. 指定刷新频率

    bash

    top -d 5     # 每 5 秒刷新一次(默认 3 秒)
    
  3. 查看历史记录

    bash

    top -b -n 10 > top.log  # 以批处理模式输出 10 次结果到文件
    

3.pgrep命令——查看进程信息

pgrep(Process Grep)用于根据进程名称、用户、状态等属性快速查找进程 ID(PID),是 ps aux | grep 的简化版,适合脚本或快速定位进程。

 常用选项
选项功能描述
-u username按用户过滤进程(支持 UID)
-x精确匹配进程名称(避免部分匹配)
-l显示进程名(默认仅显示 PID)
-n显示最新启动的进程(Newest)
-o显示最旧启动的进程(Oldest)
-P pid查找指定父进程的子进程(支持多父进程 , 分隔)
-t tty按终端过滤(如 pts/0tty1
-s sid按会话 ID 过滤
-g gid按进程组 ID 过滤
-f匹配完整命令行(而非仅进程名)
-v反向匹配(排除包含关键字的进程)
-V显示版本信息
3. 输出格式

bash

pgrep [选项] pattern

  • 无选项:输出匹配进程的 PID。
  • -l:输出 PID 进程名
  • -f:输出 PID 完整命令行
4. 实战示例
  1. 按进程名查找

    bash

    pgrep sshd       # 查找所有名为 sshd 的进程
    pgrep -x sshd    # 精确匹配(排除如 sshd: 的子进程)
    
  2. 按用户过滤

    bash

    pgrep -u mysql   # 查找 MySQL 用户的进程
    pgrep -u 1000    # 按 UID 查找
    
  3. 显示进程名和 PID

    bash

    pgrep -l firefox  # 输出类似 "1234 firefox"
    
  4. 查找最新或最旧进程

    bash

    pgrep -n java    # 查找最新启动的 Java 进程
    pgrep -o java    # 查找最旧启动的 Java 进程
    
  5. 按父进程 ID 查找子进程

    bash

    pgrep -P 1234    # 查找父进程为 1234 的所有子进程
    
  6. 按终端过滤

    bash

    pgrep -t pts/0   # 查找在 pts/0 终端运行的进程
    
  7. 匹配完整命令行

    bash

    pgrep -f "java -jar app.jar"  # 精确匹配完整命令
    
  8. 反向匹配(排除特定进程)

    bash

    pgrep -v grep    # 查找所有非 grep 的进程
    
5. 结合其他命令使用
  1. 终止匹配的进程

    bash

    pgrep firefox | xargs kill  # 杀死所有 firefox 进程
    
  2. 查看进程详细信息

    bash

    pgrep -l mysql | awk '{print $1}' | xargs ps -f  # 显示 MySQL 进程详细信息
    
  3. 监控进程状态

    bash

    while true; do pgrep -l redis && sleep 1; done  # 循环检查 Redis 是否存活
    

4.pstree命令——查看进程树

1. 基础功能

pstree 以树状结构展示进程间的父子关系,直观呈现系统中进程的层级分布,便于快速定位服务依赖或排查僵尸进程。

2. 常用选项
选项功能描述
-u显示进程所属用户(支持 UID)
-p显示进程 ID(PID)
-a显示完整命令行参数
-n按 PID 排序(默认按进程名排序)
-c不合并相同子进程(避免因重复而折叠显示)
-h高亮显示当前终端进程($PPID
-l允许长输出(换行显示长命令行)
-s pid从指定 PID 开始向上追溯父进程链
-T使用文本字符绘制树(兼容非 Unicode 环境)
-U使用 UTF-8 字符绘制树(默认)
-Z显示进程安全上下文(SELinux 相关)
-G使用 ASCII 字符绘制树(与 -T 类似)
3. 输出格式

bash

pstree [选项] [pid/process_name]

  • 无参数:以 systemd(或 init)为根显示所有进程。
  • 指定 PID / 进程名:仅显示该进程及其子进程。
4. 实战示例
  1. 基础用法

    bash

    pstree                   # 显示所有进程的树状结构
    pstree -p                # 显示进程 PID
    pstree -u                # 显示进程所属用户
    
  2. 过滤特定进程

    bash

    pstree sshd              # 仅显示 sshd 及其子进程
    pstree -s 1234           # 从 PID 1234 向上追溯父进程链
    
  3. 美化输出

    bash

    pstree -aUl              # 显示完整命令行、用户、允许换行
    pstree -Tn               # 按 PID 排序并显示进程名
    
  4. 查看用户进程

    bash

    pstree -u username       # 显示指定用户的所有进程树
    
  5. 高亮当前终端进程

    bash

    pstree -h                # 高亮显示当前终端的父进程(如 bash)
    
5. 输出解读

bash

systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─agetty
        ├─bash───pstree
        └─sshd───sshd───bash

  • 符号说明
    • :普通子进程。
    • ├─:分支子进程。
    • └─:最后一个分支。
    • *[]:表示多个相同子进程(如 2*[bash] 表示两个 bash 进程)。
6. 结合其他命令使用
  1. 杀死进程树

    bash

    pstree -p nginx | grep -oP '\d+' | xargs kill -9  # 终止 nginx 及其子进程
    
  2. 生成进程树图片

    bash

    pstree -p | dot -Tpng -o process_tree.png  # 需要安装 graphviz
    
  3. 监控特定进程变化

    bash

    watch -n 1 pstree -p sshd  # 每秒刷新 sshd 进程树
    
7. 注意事项
  1. 权限问题

    • 普通用户只能查看自己的进程,sudo pstree 可显示所有进程。
  2. 输出折叠

    • 默认会合并相同子进程(如 2*[bash]),使用 -c 可禁用此行为。
  3. 性能影响

    • 系统进程较多时,pstree 可能短暂卡顿(建议结合过滤条件使用)。
8. 替代工具
  • htop:交互式查看进程树(按 F5 显示树状结构)。
  • ps --forest:文本形式显示进程树。
  • systemd-cgls:查看 systemd 控制组的进程树。
9. 示例场景
  1. 排查服务依赖

    bash

    pstree -a redis-server  # 查看 Redis 服务的依赖进程
    

  2. 定位僵尸进程

    bash

    pstree -p | grep defunct  # 查找标记为 defunct 的僵尸进程
    

  3. 验证终端会话

    bash

    pstree -h  # 查看当前终端(如 bash)的父子进程关系
    

二  控制进程

1.启动进程

(1)手工启动进程

由用户手工输入命令或者可执行程序的路径,可以至少启动一个进程。根据该进程是否需要占用当前的命令终端,手工启动又可以分为前台启动和后台启动。
进程在前台运行(如执行“1s-1”命令)时,用户必须等到该进程执行结束并退出以后才能继续输入其他命令,大多数命令操作在前台启动运行。进程在后台运行时,用户可以继续在当前终端中输入其他命令,而无须等待该进程结束,适用于运行耗时较长的操作。
启动后台进程需要使用“&”操作符,将“&”操作符放在要执行命令的最后面,进程启动后会直接放入后台运行,而不占用前台的命令操作界面,方便用户进行其他操作。例如,当使用cp命令从光盘中制
作镜像文件时,由于需要复制的数据较多,耗时较长,因此可结合“&”符号将复制操作放到后台运行,以便用户可以继续执行其他命令操作,代码如下:
[root@localhost ~]# cp /dev/cdrom mycd.iso &

[1]   6426                         #输出信息中包括后台任务序号,PID号

(2)调度启动进程

在服务器维护工作中,经常需要执行一些比较费时而且较占用资源的任务(如数据备份),这些任务
更适合在相对空闲的时候(如夜间)进行。这时就需要用户事先进行调度安排,指定任务运行的时间,当系统到达设定时间时会自动启动并完成指定的任务。调度启动的计划任务进程均在后台运行,不会占用用户的命令终端。
进程的调度启动可以通过at、crontab 命令进行设置,其中at命令用于设置一次性(如12:15时
重启网络服务)计划任务,crontab命令用于设置周期性运行(如每周五17:30备份数据库)的计划任务。

2.改变进程的运行方式

(1)挂起当前进程

当Linux 操作系统中的命令正在前台执行时(运行尚未结束),按Ctrl+2组合键可以将当前进程挂起(调入后台并停止执行),这种操作在需要暂停当前进程并进行其他操作时特别有用。例如,在使用 cp 命令镜像文件时,发现复制速度缓慢,为了不耽误其他操作,可以按Ctr1+Z组合键将该下载任务调入后台并暂停执行,代码如下:
[root@node01 ~]# cp /dev/cdrom mycd.iso

^Z


[1]+ 已停止    cp -i /dev/cdrom mycd.iso

(2)查看后台的进程

需要查看当前终端中在后台运行的进程任务时,可以使用jobs命令,结合“-1”选项可以同时显示该进程对应的PID号。在jobs命令的输出结果中,每一行记录对应一个后台进程的状态信息,行首的
数字表示该进程在后台的任务编号。若当前终端没有后台进程,将不会显示任何信息。例如,执行如下的“jobs -l”命令可以看到前面挂起的wget下载任务的相关信息。

[root@node01~]#jobs -l
[1]+ 4864 Stopped    cp -i/dev/cdrom mycd.iso

(3)将后台的进程恢复运行

使用bg(BackGround,后台)命令,可以将后台中暂停执行(如按Ctr1+Z组合键挂起)的任务恢复运行,继续在后台执行操作;而使用fg命令(ForeGround,前台),可以将后台任务重新恢复到前台运行。
除非后台中的任务只有一个,否则bg 和 fg命令都需要指定后台进程的任务编号作为参数。例如,
执行如下的“fg 1”命令可以将之前挂起至后台的wget进程重新调入前台执行。
[root@node01~]#  fg 1
cp -i /dev/cdrom mycd.iso

3.终止进程执行

当用户在前台执行某个进程时,可以按Ctrl+C组合键强制进行中断(如命令长时间没有响应的情况下)。中断前台进程的运行后,系统将返回命令行提示符状态等待用户输入新的命令。当按Ctrl+C 组合键无法终止程序或者需要结束在其他终端或后台运行的进程时,可以使用专用的进程终止工具kill、 killall 和 pkill

(1)使用kill命令终止进程

通过 kill 命令终止进程时,需要使用进程的 PID号作为参数。无特定选项时,kill命令将给该进程发送终止信号并正常退出运行,若该进程已经无法响应终止信号,则可以结合“-9”选项强行终止进程。强制终止进程时可能会导致程序运行的部分数据丢失,因此不到不得已时不要轻易使用“-9”选项。

(2)使用killall命令终止进程

使用 killall 命令可以通过进程名称来终止进程,当需要结束系统中多个相同名称的进程时,使用 killall 命令将更加方便,效率更高。killall命令同样也有“-9”选项。例如,执行如下的“killall-9 vim”命令可将所有名为 vim 的进程都强行终止。

(3)使用pkill命令终止进程

使用pkill 命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,大部分选项与pgrep命令基本类似,如“-U”(指定用户)、“t”(指定终端)等选项,使用起来非常方便。例如,若要终止由用户zhangsan启动的进程(包括登录Shell) 。

计划任务管理

一  at  一次性任务设置

二  安装顺序

使用at命令设置的计划任务只在指定的时间点执行一次,前提是对应的系统服务atd必须已经运行。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后,否则将无法正确设置计划任务。
设置一次性计划任务时,在at命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at>”提示符的任务辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按Ctrl+D组合键提交任务。所设置的命令操作将在计划的时间点被依次执行。

三  crontab 周期性任务设置

1.crontab的配置文件和目录

(1)/etc/crontab——系统任务配置文件

/etc/crontab文件中设置的是维护Linux操作系统所需的任务,Linux操作系统及相关程序在安装时可自动设置,不建议用户手动修改此文件。例如,该文件中包括设置Shel1环境、可执行路径等变量的操作,以及每小时、每天、每周、每月需要执行的任务目录。执行如下的“cat/etc/crontab”命令可以查看/etc/crontab文件的具体内容。
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash                                          //设置执行计划任务的Shell 环境

PATH=/sbin:/bin:/usr/sbin:/usr/bin                 //定义可执行命令及程序的路径

MAILTO=root                                                //将任务输出信息发送到指定用户的邮箱

(2)/var/spool/cron/——用户cron任务的配置文件存放目录

由用户自行设置(使用crontab 命令)的cron计划任务将被保存到目录/var/spool/cron/中,文件名与用户名相同。例如,通过如下操作可以得知,root用户的cron计划任务保存在配置文件/var/spool/cron/root中
[root@localhost ~]# ls -l /var/spool/cron/*
-rw-- -----. 1 root root 33 May 7 11:01 /var/spool/cron/root

2.使用crontab命令管理用户的计划任务

设置用户的周期性计划任务列表主要通过crontab 命令进行,结合不同的选项可以完成不同的计划
任务管理操作。常用的选项如下。

  • -e:编辑计划任务列表。
  • -u:指定所管理的计划任务属于哪个用户,默认是针对当前用户(自己)
  • -l:列表显示计划任务。 -r: 删除计划任务列表。
  • -r:删除计划任务列表
(1)编辑用户的计划任务列表
crontab -e
(2)查看用户的计划任务列表
crontab -l
(3)删除用户的计划任务列表
crontab -r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值