六、Bash Shell 与进程管理


所有人都在找捷径,唯有沉下心专注的人最快抵达终点。


第一部分:Bash Shell 基础

1. 什么是 Shell?什么是 Bash Shell?

  • Shell 是一个 命令解释器,同时也是一种编程语言(用于编写 Shell 脚本)。
  • 用户执行的每一个命令,最终都是交给系统的 内核 去操作。Shell 位于用户和内核之间。
  • 如果没有 Shell,就无法通过命令来管理 Linux 系统。

举例:

  • 执行 ls 命令 → 内核列出目录内容
  • 执行 useradd 命令 → 内核创建用户

Shell 家族的分类:

  • bashshzshcshksh ...

  • Bash 是目前 Linux 发行版默认的 Shell,可以说是天花板级别的 Shell 程序。

    查看当前使用的 Shell

    [root@lab ~]# echo $SHELL
    /bin/bash

    查看系统支持的所有 Shell

    [root@lab ~]# cat /etc/shells
    /bin/sh
    /bin/bash
    /usr/bin/sh
    /usr/bin/bash

注:/bin/sh 实际上是 /bin/bash 的快捷方式,所以 sh 本质上就是 bash

2. Bash 常用的快捷方式(提高效率)

|----------|-----------------------------|
| 快捷键 | 作用 |
| Ctrl C | 中断当前命令 |
| Ctrl Z | 停止当前命令并放入后台 |
| Ctrl S | 暂停屏幕的输出(锁屏) |
| Ctrl Q | 取消暂停屏幕的输出(解锁) |
| Ctrl U | 剪切光标前面的所有内容 |
| Ctrl Y | 粘贴刚刚剪切的内容 |
| Ctrl K | 剪切光标后面的所有内容 |
| Ctrl A | 光标跳转到行首 |
| Ctrl E | 光标跳转到行尾 |
| Ctrl W | 快速删除光标前面的一个单词 |
| Ctrl L | 快速清屏(与 clear 命令有区别,但效果类似) |

提示:Ctrl L 只是清屏并重新显示提示符,而 clear 命令会滚动屏幕,两者略有不同。


3. 命令扩展符号

|--------------|---------------------|-----------------------------------------------|
| 符号 | 含义 | 示例 |
| $(命令) | 引用命令的执行结果 | cp /etc/passwd /tmp/passwd-$(date +%F) |
| `命令` | 反引号,同样引用命令执行结果(老语法) | cp /etc/passwd /tmp/passwd-`date +%F` |
| { } | 花括号扩展,连接连续或离散的值 | 见下方示例 |
| \ | 反斜杠换行,将一行命令分成多行书写 | 见下方示例 |

花括号 { }详细示例:

复制代码
# 生成连续序列
[root@lab tmp]# touch file-{1..100}.yutianedu

# 生成离散组合
[root@lab tmp]# touch file{1,a,3,h,z}

# 用于批量重命名(巧妙用法)
[root@lab tmp]# mv file1{,.abc}   # 将 file1 重命名为 file1.abc

反斜杠 \详细示例:

复制代码
# 换行输入
[root@lab tmp]# echo huawei123 \
> redhat456
huawei123 redhat456

4. 通配符(用于匹配文件名称)

注意区分:

  • 通配符 :匹配文件名(用于 ls, cp, rm 等命令)
  • 正则表达式元字符 :匹配文件内容(用于 grep, sed, awk 等)

|---------------|-----------------------|
| 通配符 | 含义 |
| * | 匹配任意字符(包括空字符) |
| [abc] | 匹配括号内的任意一个字符(a、b 或 c) |
| [123] | 匹配 1、2 或 3 |
| [0-9] | 匹配任意一个数字 |
| [a-c] | 匹配 a、b 或 c(小写字母范围) |
| [[:alpha:]] | 匹配任意字母(不区分大小写) |
| [[:lower:]] | 匹配小写字母 |
| [[:upper:]] | 匹配大写字母 |
| [[:digit:]] | 匹配数字 |
| [[:alnum:]] | 匹配任意字母或数字 |

注意[[:alpha:]] 这类字符类外面还需要再套一层 [],例如 [[:digit:]] 才是正确的写法。


第二部分:变量

1. 变量的基本概念

  • 变量是在内存中开辟的一块地址空间,用于存储数据。
  • 变量 = 可变化的量。
  • 组成:变量名称变量值
  • 程序在运行时通过变量来读取数据。

存储位置:

  • 文件中(磁盘)
  • 变量中(内存)

举例:

复制代码
OSNAME=centos
OSNAME=rhel      # 第二次赋值会覆盖第一次

2. 变量的分类

|----------|----------------------------------------------------------|
| 类型 | 作用域 |
| 本地变量 | 仅在当前 Shell 中有效 |
| 环境变量 | 在当前 Shell 及其所有子 Shell 中有效 |
| 系统变量 | 操作系统自带,维持系统正常运行(如 PWD, HOME, PATH, PS1, UID 等) |

3. 变量的命名规则

  • 由数字、下划线、字母组成。
  • 不能以数字开头

4. 变量的定义、查看、取消

|---------------|--------------------------------------------------|
| 操作 | 命令示例 |
| 定义本地变量 | OSNAME=centos |
| 定义环境变量 | export OSNAME=centos 或先定义本地变量再 export OSNAME |
| 查看所有变量(本地+环境) | set |
| 查看环境变量 | env |
| 取消变量 | unset 变量名 |
| 使用变量 | $变量名${变量名} |

示例:

复制代码
[root@lab tmp]# OSNAME=centos
[root@lab tmp]# set | grep OSNAME
OSNAME=centos

[root@lab tmp]# env | grep OSNAME   # 无输出,因为未 export不是环境变量

[root@lab tmp]# export OSNAME
[root@lab tmp]# env | grep OSNAME
OSNAME=centos

[root@lab tmp]# unset OSNAME

注意 :对同一个变量多次赋值,会发生覆盖,后值覆盖前值。

示例:使用变量

复制代码
[root@localhost ~]# AB=1
[root@localhost ~]# export AC=2
[root@localhost ~]# echo $AB+${AC}00
1+200
[root@localhost ~]#

5. 常用系统变量详解

PS1 ------ 命令提示符
复制代码
[root@lab /]# echo $PS1
[\u@\h \W]\$
  • \u:用户名
  • \h:主机名的短格式(第一个点之前的部分)
  • \W:当前目录的 basename
  • \$:普通用户显示 $,root 用户显示 #
PATH ------ 命令文件的搜索路径
  • 分隔符冒号":"
vb 复制代码
`[root@lab tmp]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin`

示例:方法1自定义命令 将abb实现ls命令

复制代码
[root@localhost ~]# echo $PATH #查看命令文件路径已冒号作为分隔符
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
[root@localhost ~]# which ls  #查看ls命令的文件路径
alias ls='ls --color=auto'
        /usr/bin/ls
[root@localhost ~]# cp /usr/bin/ls /usr/local/bin/abb  把ls命令文件复制到$PATH路径中其中一个并改名abb
[root@localhost ~]# abb   #执行命令,无报错信息
[root@localhost ~]# touch a{1..5}.txt    #家目录没文件,所以这里我创建几个文件
[root@localhost ~]# abb          #执行abb和ls功能一样
a1.txt  a2.txt  a3.txt  a4.txt  a5.txt
[root@localhost ~]# ls           #执行ls和abb功能一样
a1.txt  a2.txt  a3.txt  a4.txt  a5.txt
[root@localhost ~]#

示例:方法2 自定义命令将时间的缩写sj和命令date一致

将路径定义到PATH变量中,如需永久生效需在配置文件写入

复制代码
[root@localhost ~]# ls
a1.txt  a2.txt  a3.txt  a4.txt  a5.txt
[root@localhost ~]# which date
/usr/bin/date
[root@localhost ~]# cp /usr/bin/date  ./sj
[root@localhost ~]# ls
a1.txt  a2.txt  a3.txt  a4.txt  a5.txt  sj
[root@localhost ~]# export PATH=$PATH:/root
[root@localhost ~]# ls
a1.txt  a2.txt  a3.txt  a4.txt  a5.txt  sj
[root@localhost ~]# sj
Mon Jun  1 02:58:56 PM CST 2026
[root@localhost ~]# sj +'%F %T'
2026-06-01 15:01:11
[root@localhost ~]#
  • 当你在命令行输入一个命令时,系统会按照 PATH 中列出的目录顺序依次查找该命令的可执行文件。
  • 如果命令不在 PATH 中,需要输入绝对路径或相对路径。

其他常用系统变量:PWD, HOME, UID 等。


第三部分:别名(alias)

1. 作用

  • 简化命令的输入。
  • 危险示例 (千万不要执行):alias cd='rm -rf /*',如果你执行 cd,实际执行的是删除根目录。

2. 常用别名示例

  • ll = ls -l --color=auto
  • rm = rm -i(默认已存在)

3. 别名的操作命令

复制代码
# 查看所有别名
alias

# 定义别名(= 左右两边不能有空格)
alias 别名='命令'

# 删除别名
unalias 别名

4. 实际需求

案例

复制代码
# 需求1:定义别名 lsnet,列出 /etc/sysconfig/network-scripts 目录
alias lsnet='ls /etc/sysconfig/network-scripts'

# 需求2:定义别名 cppasswd,将 /etc/passwd 备份到 /tmp/passwd-年-月-日
alias cppasswd='cp /etc/passwd /tmp/passwd-$(date +%Y-%m-%d)'

第四部分:环境变量配置文件与登录 Shell

1. 配置文件列表

|-------------------|------|-------------------------|
| 文件 | 作用范围 | 说明 |
| /etc/bashrc | 全局 | 对所有用户生效,定义变量、别名、函数等 |
| /etc/profile | 全局 | 登录 Shell 读取,设置环境变量、执行脚本 |
| ~/.bashrc | 用户个人 | 用户自己的别名、变量 |
| ~/.bash_profile | 用户个人 | 用户自己的环境变量,登录 Shell 读取 |
| ~/.bash_logout | 用户个人 | 用户登出时执行(例如清理临时文件) |

2. 登录 Shell 与非登录 Shell

|---------------|--------------------------------------|------------------------------------------------------------------|
| 类型 | 触发场景 | 读取的配置文件 |
| 登录 Shell | 图形化登录、命令行登录、SSH 远程登录、su - username | /etc/bashrc/etc/profile~/.bashrc~/.bash_profile |
| 非登录 Shell | su username、图形化桌面的终端标签、执行 Shell 脚本 | /etc/bashrc~/.bashrc |

重要结论 :无论是登录还是非登录 Shell,最终都会读取 /etc/bashrc

3. su -su 的区别

  • su - username登录 Shell,完整切换用户环境,读取所有配置文件。
  • su username非登录 Shell ,保留当前环境变量,只读取 /etc/bashrc~/.bashrc

示例:

复制代码
# 切换到 zhangsan 用户(登录 Shell)
su - zhangsan
# 触发文件:/etc/bashrc → /etc/profile → /home/zhangsan/.bashrc → /home/zhangsan/.bash_profile

# 切换到 zhangsan 用户(非登录 Shell)
su zhangsan
# 触发文件:/etc/bashrc → /home/zhangsan/.bashrc

4. 配置文件优先级

后读取的文件会覆盖先读取的同名变量或别名。

优先级(从低到高):

复制代码
/etc/bashrc < /etc/profile < ~/.bashrc < ~/.bash_profile

5. 实际需求案例

需求 :系统上所有用户都存在一个变量 OSNAME=rhel,只有 zhangsan 用户的 OSNAME=centos

实现:

  • /etc/bashrc 中写入:export OSNAME=rhel
  • /home/zhangsan/.bashrc 中写入:export OSNAME=centos

这样,zhangsan 登录时会先读取 /etc/bashrc 得到 rhel,然后被自己家目录的 .bashrc 覆盖为 centos

6. 登出文件

  • 退出用户时,会触发 ~/.bash_logout 文件(如果存在)。

第五部分:进程管理(详细)

1. 进程概述

  • 进程:程序运行的一个实例。一个程序可以运行多个进程。
  • 每个进程有唯一的 PID(Process ID)。
  • PID 被使用后,该进程结束时会回收 PID,后续新进程可能随机分配到该 PID。
  • PID 为 1 的进程
    • CentOS 7 及以后:systemd
    • CentOS 6 及以前:initd
  • 系统上几乎所有进程都是 systemd 派发出来的子进程。
  • 守护进程:在后台持续运行,不占据前端终端。
父子进程关系(以 Nginx 为例)
复制代码
[root@lab ~]# ps -ef | grep nginx
root   4531   1  0 11:18 ?   00:00:00 nginx: master process /usr/sbin/nginx
nginx  4532 4531 0 11:18 ?   00:00:00 nginx: worker process
nginx  4533 4531 0 11:18 ?   00:00:00 nginx: worker process
  • master process:父进程,监听端口和管理员配置修改,同步给子进程。
  • worker process:子进程,接受用户请求并响应。
孤儿进程
  • 定义:父进程意外退出,没有给子进程发送退出指令,子进程变成孤儿进程。
  • 处理 :PID 为 1 的 systemd 会接管孤儿进程,并发送退出指令。
  • 影响:无不良影响,会被快速回收。
僵尸进程
  • 定义:子进程已经结束,但还没有完全退出(父进程未回收它的状态),变成僵尸进程。
  • 特点:子进程先于父进程退出,父进程认为子进程已结束而不发送退出信号。
  • 危害:僵尸进程会占据 PID、CPU 和内存资源且不会自动释放。
  • 解决方法:重启父进程或发送信号强制父进程回收。

2. 静态查看进程 -- ps

  • 静态:不会实时变化,每次需重新执行。

    查看当前终端运行的进程

    [root@lab ~]# ps
    PID TTY TIME CMD
    4719 pts/0 00:00:00 bash
    5727 pts/0 00:00:00 ps

列说明:

  • PID:进程 ID

  • TTY:终端类型(tty/1 虚拟控制台,pts/0 伪终端如 SSH、图形化终端)

  • TIME:进程占用 CPU 时间片的总时长(值越高CPU的资源消耗越高)

  • CMD:启动进程的命令

  • USER:运行这个进程的用户(这里全是 root,系统核心进程)

  • PID :进程唯一 ID(杀进程用 kill PID

  • %CPU:CPU 使用率(不代表全部CPU,超过100%也很正常)

  • %MEM:内存使用率

  • VSZ:虚拟内存占用(KB)

  • RSS:实际物理内存占用(KB)

  • TTY :终端(? 表示无终端,后台系统进程)

  • STAT进程状态(最重要)

  • START:启动时间

  • TIME:累计占用 CPU 时间

  • COMMAND:进程命令 / 程序

状态码 STAT :

  • Ss:睡眠 + 会话主进程
  • S:普通睡眠
  • I:内核空闲线程
  • I<:高优先级内核线程
  • R:运行中
  • R+:前台运行
  • Ssl:带线程的睡眠进程

示例:ps -aux

复制代码
# 查看进程的 CPU 和内存占比
ps -aux
# -a:显示所有终端进程
# -u:显示进程占资源的比例
# -x:显示内核运行的进程


[root@localhost ~]# ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 105436 13312 ?        Ss   May30   0:04 /usr/lib/syst
root           2  0.0  0.0      0     0 ?        S    May30   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        S    May30   0:00 [pool_workque
root           4  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/R-rc
root           5  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/R-rc
root           6  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/R-sl
root           7  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/R-ne
root           9  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/0:0H
root          11  0.0  0.0      0     0 ?        I<   May30   0:00 [kworker/R-mm
root          13  0.0  0.0      0     0 ?        I    May30   0:00 [rcu_tasks_kt
root          14  0.0  0.0      0     0 ?        I    May30   0:00 [rcu_tasks_ru
root          15  0.0  0.0      0     0 ?        I    May30   0:00 [rcu_tasks_tr
root          16  0.0  0.0      0     0 ?        S    May30   0:02 [ksoftirqd/0]
root          17  0.0  0.0      0     0 ?        S<   May30   0:00 [pr/ttyS0]

示例:ps -ef

复制代码
# 查看进程的 PPID(父进程ID)
ps -ef
# -e:显示所有进程
# -f:显示额外信息(PPID、CPU百分比、启动时间等)

示例:ps-axo 自定义输出格式

复制代码
# 自定义输出格式
ps -axo user,pid,ppid,%cpu,%mem,vsz,rss,command | head
# -o:指定输出字段
# vsz:虚拟内存,rss:实际内存

示例:ps -axo --sort 排序

复制代码
# 排序(--sort)
ps -axo user,pid,%cpu --sort=-%cpu   # 按 CPU 降序,-%cpu加-是降序,不加是升序

3. 动态查看进程 -- top

  • 实时刷新,默认每 3 秒一次。

  • 启动时指定刷新间隔:top -d 数字

    top -d 1 # 每1秒刷新

第 1 行:系统概览(等同于 uptime

复制代码
top - 16:18:52 up 1 day, 18:09,  1 user,  load average: 0.02, 0.04, 0.00
  1. 16:18:52:当前系统时间
  2. up 1 day, 18:09:服务器已运行时长(1 天 18 小时 9 分)
  3. 1 user:当前登录系统的用户数
  4. load average: 0.02, 0.04, 0.001 分钟、5 分钟、15 分钟系统平均负载
    • 负载值逻辑:CPU 核数为阈值,4 核 CPU 负载 4 代表满载,大于 4 代表 CPU 拥堵。
第 2 行:进程 Tasks 统计

plaintext

复制代码
Tasks: 111 total,   1 running, 110 sleeping,   0 stopped,   0 zombie
  • 111 total:系统总进程数量
  • 1 running:正在 CPU 运行的进程
  • 110 sleeping:休眠进程(等待 IO / 时间片,绝大多数进程)
  • 0 stopped:暂停 / 后台挂起进程(Ctrl+Z 暂停的程序)
  • 0 zombie:僵尸进程(子进程退出、父进程未回收资源)
第 3 行:CPU 整体使用率 % Cpu (s)

plaintext

复制代码
%Cpu(s):  0.8 us,  0.8 sy,  0.0 ni, 97.8 id,  0.0 wa,  0.3 hi,  0.2 si,  0.0 st

表格

|--------|--------------|--------------------------------------|
| 字段 | 全称 | 含义 |
| us | user | 用户态 CPU 占用(业务程序、用户进程) |
| sy | system | 内核态 CPU 占用(系统内核操作) |
| ni | nice | 调整过 nice 优先级的用户进程 CPU 占比 |
| id | idle | 空闲 CPU(数值越高 CPU 越闲,你截图 97% 几乎空闲) |
| wa | iowait | IO 等待 CPU(磁盘读写阻塞,高则磁盘瓶颈) |
| hi | hardware irq | 硬件中断 CPU 占用 |
| si | software irq | 软中断 CPU 占用(网络收发包、内核软任务)等待任务 |
| st | steal | 虚拟化偷取时间(云服务器宿主机抢占你的 CPU,物理机一般为 0) |

第 4 行:物理内存 Mem(单位 MiB)

内存占满系统不会挂会触发OOM,也就是会结束某些进程

复制代码
MiB Mem :  1675.7 total,   617.7 free,   479.8 used,   766.9 buff/cache
  • total:总物理内存(1675MB ≈ 1.6G)
  • free:完全空闲、未使用内存
  • used:已被程序占用内存
  • buff/cache:缓冲区 + 页缓存(Linux 利用空闲内存缓存磁盘文件,可回收给应用)
  • 末尾 1195.9 avail Mem可用内存(free + 可回收 cache,真实能分给新程序的内存)
第 5 行:交换分区 Swap

plaintext

复制代码
MiB Swap:    0.0 total,    0.0 free,    0.0 used.
  • total:交换分区总大小,这里 0 代表未配置 swap 交换分区
  • used:已使用 swap(数值持续上涨代表物理内存不足,频繁换页卡顿)
  • free:空闲 swap 空间

top 界面中的重要字段:

  • PID :进程 ID,进程唯一标识,kill PID 可终止进程
  • USER:运行该进程的用户(root = 管理员)
  • PR:进程实时优先级,数字越小优先级越高;常规进程默认 20
  • NI:Nice 值(进程友好度),范围 -20 ~ 19
  • -20:最高优先级;19:最低优先级;0 默认;root 可设负值提权
  • VIRT:虚拟内存总量(VSS)= 程序代码 + 库 + 堆 + 共享库 + 交换内存,进程申请的全部虚拟地址空间
  • RES :常驻物理内存(RSS),进程实际占用物理内存(不含 swap、不含未载入的虚拟内存)
  • SHR:共享内存大小,和其他进程共用的库、文件内存
  • S:进程状态(关键标识)
  • S:Sleeping 休眠(等待资源,大部分进程)
  • R:Running 正在 CPU 运行
  • I:Idle 空闲内核线程(截图里 kworker 都是 I)
  • Z:Zombie 僵尸进程
  • T:Stopped 暂停进程
  • %CPU:进程 CPU 使用率(单 CPU 核占比,多核进程可能超过 100%)
  • %MEM:进程占用整机物理内存百分比
  • TIME+ :进程累计 CPU 运行时间(时分秒,AliYunDun 30 小时持续运行)
  • COMMAND:进程启动命令 / 程序名

中断号

top 内常用快捷键:

|-----|----------------|
| 快捷键 | 作用 |
| 1 | 列出所有 CPU 核心的信息 |
| c | 显示命令的完整路径和参数 |
| C | 按 CPU 占用率降序排序 |
| M | 按内存占用率降序排序 |
| q | 退出 top |

4. 进程通信方式 -- 信号机制(kill)

进程之间通信的方式:

  • 管道
  • 信号机制
  • 共享内存
  • socket 套接字等。
  • 套接字:以文件形式存在于系统上,只能本机进程访问。

信号(signal)机制:一个进程可以向另一个进程发送信号,接收方会优先处理信号。

kill 命令本质是发送信号,不只是结束进程。

常用信号:

kill-l列出所有信号

复制代码
[root@localhost ~]# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

|------|---------|------------------------------|
| 信号编号 | 名称 | 作用 |
| 15 | SIGTERM | 正常退出信号(默认) |
| 9 | SIGKILL | 强制退出(危险,可能导致数据丢失) |
| 19 | SIGSTOP | 停止进程 |
| 1 | SIGHUP | 重载配置文件 |
| 12 | SIGUSR2 | Nginx 热升级中用到(先启动新进程,慢慢结束旧进程) |

命令示例:

复制代码
kill -9 PID
kill -15 PID

# 其他发送信号的命令
pkill -U username      # 结束指定用户的所有进程
pkill -G groupname     # 结束指定组的进程
pkill -t pts/0         # 结束指定终端的进程

killall nginx          # 结束所有名为 nginx 的进程

5. 调整进程优先级(nice 值)

  • nice 值:进程的静态优先级,范围 -20 到 19,值越小优先级越高。
  • 生效条件:只有在系统资源紧张时,nice 值的差异才会体现。如果系统空闲,即使优先级最高也看不出区别。
方法一:调整已运行的进程
复制代码
# 查看进程的 nice 值
[root@lab ~]# ps -axo user,pid,ni,command | grep vim
root   8426   0 vim /etc/passwd

# 调整 nice 值
[root@lab ~]# renice -n -15 8426
8426 (process ID) old priority 0, new priority -15

# 再次查看
[root@lab ~]# ps -axo user,pid,ni,command | grep vim
root   8426 -15 vim /etc/passwd
方法二:启动进程时指定 nice 值
复制代码
[root@lab ~]# nice -n 10 vim /etc/passwd

6. 后台作业管理

将进程放入后台运行
复制代码
命令 &
# 例如:
[root@localhost ~]# firefox &
[1] 496062
#任务号,进程ID
查看后台作业
复制代码
[root@localhost ~]# jobs
[1]+  Exit 127                firefox
结束后台作业
复制代码
kill %作业号
# 例如:kill %1
将停止的作业继续运行
  • 在后台运行bg %作业号

    [root@lab ~]# bg %2
    [2]+ firefox &

  • 放到前台运行fg %作业号

    [root@lab ~]# fg %2
    firefox

注意 :以上方式启动的后台作业依赖于当前终端。如果终端退出,这些作业也会终止。

7. 持续运行的后台作业 -- nohup

  • nohup 可以让作业持续运行,即使终端退出,内核会接管该进程,只要内核正常,进程就不会关闭。

    nohup 命令 &

    例如:

    nohup firefox &


总结

  • Shell 概念、Bash 快捷键、扩展符号、通配符
  • 变量(本地/环境/系统)的定义、使用、配置文件
  • 别名的定义与危险示例
  • 环境变量文件的加载顺序、登录/非登录 Shell 的详细区别
  • 进程管理:静态 ps、动态 top、信号机制、nice 值、后台作业、nohup
相关推荐
A不落雨滴AI1 小时前
DKERP 客户端重构:30天从零到一的架构演进之路
前端
Xp021911031 小时前
知网研学、万方、WPS、大以论文四大排版工具横评,新用户免费排版等你领!
前端·css·html·生活·wps·论文排版
全栈技术负责人1 小时前
老项目新需求AI前端开发指南
前端·ai编程
周凡1231 小时前
AI 时代的 Web JavaScript 逆向分析实践与思考
前端·javascript·人工智能
jerryinwuhan1 小时前
marker BiBERTo解释
java·前端·人工智能
zhoumeina991 小时前
分段创建产品,tab 页切换又要保留缓存
前端·javascript
SilentSamsara1 小时前
命令行工具开发:Click/Typer + 打包为独立二进制
linux·服务器·开发语言·前端·python·青少年编程·fastapi
恋猫de小郭1 小时前
能在手机本地跑的图像生成模型 Bonsai Image ,效果还不错
前端·aigc·ai编程
Bigger1 小时前
实战:搭建 AI Code Review 自动化流水线
前端·ci/cd·自动化运维