引言
在Ubuntu系统中,权限管理与进程服务管理是构建稳定、安全运行环境的两大基石,也是每一位系统管理员和开发者必须掌握的底层核心技能。权限体系作为Linux系统的“守门人”,通过用户、组、其他角色的三重权限划分,结合读(r
)、写(w
)、执行(x
)的精细控制,既保障了多用户环境下的数据隔离性,也为潜在的安全威胁设置了动态屏障——从日常文件操作中 chmod
、chown
的权限微调,到 sudo
特权委派的风险权衡,每一个决策都可能影响系统的安全水位。而进程与服务管理则是系统资源的“调度中枢”,无论是通过 ps
、top
实时洞察进程的资源足迹,还是运用 systemctl
精准掌控服务的生命周期,亦或是借助 journalctl
在日志海洋中抽丝剥茧定位故障,这些工具链的熟练运用直接决定了运维响应效率与系统稳定性。本文将以实战为导向,深入解析权限模型的运作逻辑,拆解 chmod
数字模式与符号模式的本质差异;同时结合现代Ubuntu系统特性,演示如何通过 systemd
架构实现服务的精细化管控,并针对“僵尸进程吞噬资源”“服务启动权限陷阱”等典型场景提供解决方案,为各位观众老爷构建从权限基础到高阶管控、从进程观测到服务优化的完整知识图谱。
最后,如果大家喜欢我的创作风格,请大家多多关注up主,你们的支持就是我创作最大的动力!如果各位观众老爷觉得我哪些地方需要改进,请一定在评论区告诉我,马上改!在此感谢大家了。
各位观众老爷,本文通俗易懂,快速熟悉Ubuntu,收藏本文,关注up不迷路,后续将持续分享ubuntu纯干货(请观众老爷放心,绝对又干又通俗易懂)。请多多关注、收藏、评论,评论区等你~~~
Linux权限管理是系统安全的核心基石,通过用户
User
、组Group
、其他Others
三类角色和读r
、写w
、执行x
三种权限,构建了细粒度的访问控制机制。理解权限模型的关键在于区分文件与目录权限的本质差异,并掌握chmod
、chown
、chgrp
等核心命令的使用。本章从权限基础解析入手,深入探讨权限分配逻辑及操作实践,帮助开发者规避安全风险,实现高效、安全的资源管理。
一、 权限管理:从基础到高级控制
1.1 理解Linux权限模型
Linux的权限模型通过 用户 User
、组 Group
、其他 Others
三个角色,以及 读 r
、写 w
、执行 x
三种权限,实现对文件和目录的访问控制。
1.1.1 用户/组/其他三类角色
- 用户(User)
- 文件或目录的所有者(创建者或当前拥有者)。
- 权限通过
chown
命令修改。
- 组(Group)
- 一组用户的集合,共享相同的权限。
- 文件所属组通过
chgrp
或chown
修改。
- 其他(Others)
- 除所有者和所属组外的所有用户。
- 通常权限设置最严格,避免未授权访问。
1.1.2 读(r
)、写(w
)、执行(x
)权限解析
(一)三种不同的权限对文件和目录的影响
权限 | 对文件的影响 | 对目录的影响 |
---|---|---|
r | 读取文件内容(如 cat 、less )。 | 列出目录内容(如 ls ),但需配合 x 权限才能访问文件元数据。 |
w | 修改文件内容(如 vim )。 | 增删目录内的文件或子目录(需配合 x 权限)。 |
x | 执行文件(如脚本或二进制程序)。 | 进入目录( cd )或访问其子项(即使无 r 权限,但需知道文件名)。 |
(二)权限表示示例
权限三元组(以 ls -l
输出为例)
-rwxr-xr-- 1 user group 4096 Jan 10 10:00 script.sh
# 解释
-rwxr-xr-- (文件类型及用户/组/其他用户的权限组合)
1 (指向此文件的硬链接数量,普通文件默认是 1,目录的硬链接数等于子目录数 + 2)
user (文件的所有者/拥有者账户名)
group (文件所属的用户组名)
4096 (文件内容的字节数(若为目录,表示目录元数据占用空间,而非实际内容大小))
Jan 10 10:00 (文件最后一次被修改的日期和时间)
script.sh (文件名称)
- 字符含义
字符 | 说明 | 数值表述 |
---|---|---|
- | 普通文件(如脚本、文本、二进制文件等) | |
rwx | 所有者 user 的权限(读、写、执行) | 7 (4+2+1) |
r-x | 所属组 group 成员的权限(读、执行) | 5 (4+0+1) |
r-- | 非所有者和非组成员的权限(其他人)(读) | 4 (4+0+0) |
- 权限效果说明
权限对象 | 允许的操作 |
---|---|
所有者 user | - 读取文件内容- 修改文件内容- 将文件作为程序执行(如运行脚本 ./script.sh) |
组成员 group | - 读取文件内容- 将文件作为程序执行(但无法修改文件内容) |
其他用户 | - 仅可读取文件内容(不可修改或执行) |
注释:r
读取(4) ,w
写入(2) ,x
执行(1)。
1.1.3 文件与目录的区别
(一)权限类型对比
权限类型 | 文件 | 目录 |
---|---|---|
r (读) | 查看内容。 | 列出子项名称(需 x 权限才能生效)。 |
w (写) | 修改内容。 | 增删子项(必须同时有 x 权限)。 |
x (执行) | 运行程序。 | 进入目录或访问子项元数据(如 stat 文件)。 |
(二)关键区别与示例
-
执行权限对目录的意义
- 无
x
权限时:- 即使有
r
权限,无法执行ls
查看详细内容。 - 无法通过路径直接访问子文件(如
cat dir/file
会失败)。
- 即使有
- 有
x
权限但无r
权限:- 无法列出子项,但已知文件名时可直接访问(如
cat dir/known_file
)。
- 无法列出子项,但已知文件名时可直接访问(如
- 无
-
删除文件的权限依赖
- 删除文件需要 目录的
w
和x
权限,与文件本身的权限无关。 - 示例:若用户对目录有
rwx
权限,即使文件是只读的,用户仍可删除它。
- 删除文件需要 目录的
-
权限组合示例
- 目录权限
drwxr-xr--
:- 用户可读写执行;组用户可读和执行;其他用户仅可读(但无法进入目录,因缺少
x
)。
- 用户可读写执行;组用户可读和执行;其他用户仅可读(但无法进入目录,因缺少
- 目录权限
dr-xr-x---
:- 用户和组可进入并访问已知文件;其他用户无权限。
- 目录权限
注释:
- 文件权限:控制内容操作(读/写/执行)。
- 目录权限:控制结构操作(列出/进入/修改子项)。
- 目录的
x
权限是核心:无x
则大多数操作受限,即使有r
或w
。 - 合理分配权限需结合业务场景,遵循最小权限原则。
1.2 核心权限操作命令
1.2.1 chmod
:修改文件权限
(一)基础概念
chmod
指令是一个用于修改文件或目录权限的核心命令,其全称为Change Mode。它通过调整权限位来控制用户对文件或目录的访问方式(如读、写、执行),从而实现访问权限的精细化管理。
(二)数字模式与符号模式
命令的基本语法指令:
chmod [数字模式] [对象] # 数字模式
chmod [对象 ± = 修改类型] [对象] # 符号模式
- 数字模式(推荐新手)
所谓的数字模式就是我们刚在注释所讲的内容,将“读”,“写”,“执行”以数字形式表达,非常方便。
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.txt # rw-r--r--
常见权限组合:
数字模式 | 表达 | 使用场景 |
---|---|---|
755 | user :rwx,group :r-x,其他用户:r-x | 可执行脚本/程序 |
600 | user :rw-,group :—,其他用户:— | 私有配置文件(仅所有者可读写) |
- 符号模式(精准调整)
符号模式更加注重于对所有者/所属组/其他用户所拥有的权限进行精准调控,有点可视化的感觉,数字无法直观看出所增加/减少的权限类型。
chmod u+x backup.sh # 给所有者添加执行权限
chmod g-w sensitive.txt # 移除所属组的写入权限
chmod o=r-- public.txt # 设置其他用户只读
chmod u+rwx,g=rx,o-r file.txt # 所有者增加读写执行,组设为读执行,其他用户移除读权限
chmod -R u+rwx /var/www # 递归设置目录及内部文件权限
注释: 在Ubuntu系统中,默认不启用root
用户,普通用户需通过sudo
临时提升权限来执行需要管理员操作的chmod
命令。例如:
sudo chmod 644 /etc/nginx/nginx.conf # 需输入当前用户密码验证
但是,这里本人还是推荐数字模式,我的感受是,虽然符号模式更精准,但该文件/目录原来到底有哪些权限我是需要查询的,然后才能修改。而使用数字模式则可以直接赋予我想有给它的权限范围,无需事先查询。
1.2.2 chown
:变更文件所有者与组
(一)基础概念
chown
命令全称为 Change Owner,是一个用于修改文件或目录的所有者user
及所属组group
的核心命令,调整文件的属主和属组来控制不同用户或用户组的访问权限。只有root
用户或有 sudo
权限的普通用户才能执行此命令。Ubuntu默认禁用root
直接登录,因此普通用户需通过sudo
临时提权操作。
(二)基本语法与示例
命令的基本语法指令:
chown [选项] [所有者][:组] 文件/目录
常见使用示例
# 修改文件所有者
sudo chown new_owner filename # 将文件所有者改为new_owner
sudo chown alice file.txt # 将file.txt的所有者设为alice
# 同时修改所有者和组
sudo chown alice:developers file.txt # 所有者设为alice,组设为developers
# 仅修改所属组
sudo chown :developers file.txt # 仅修改组为developers(所有者不变)
# 递归修改目录及子内容
sudo chown -R alice:developers project/ # 递归修改project目录及所有子文件/目录
# 参考其他文件权限
sudo chown --reference=source.txt target.txt # 将target.txt的属主/组设为与source.txt相同
1.2.3 chgrp
:单独修改文件所属组
(一)基础概念
chgrp
命令全称为 Change Group,是一个专门用于修改文件或目录的所属组的核心命令。通过调整文件的属组,可以控制不同用户组的访问权限。与 chown :组
的操作等价,但 chgrp
语法更直观。同样需要 root
权限或通过 sudo
提权执行。
(二)基本语法与示例
命令的基本语法指令:
chgrp [选项] 新组名 文件/目录
常见使用示例
# 修改文件的所属组
sudo chgrp developers file.txt # 将file.txt的所属组设为developers
# 递归修改目录及子内容的所属组
sudo chgrp -R developers project/ # 递归修改project目录及所有子文件/目录的组
# 参考其他文件的组设置
sudo chgrp --reference=source.txt target.txt # 将target.txt的组设为与source.txt相同
# 修改多个文件的组(支持通配符)
sudo chgrp staff *.log # 将所有.log文件的组设为staff
# 修改符号链接指向的文件组(默认不跟随符号链接)
sudo chgrp -h devteam symlink_file # 修改符号链接自身的组(而非其指向的文件)
(三)注意事项
-
权限要求:
- 用户必须属于目标组或拥有
root
/sudo
权限,否则会报错Operation not permitted
。
- 用户必须属于目标组或拥有
-
递归操作的风险:
-R
选项会递归修改目录内所有子项,可能导致意外覆盖权限,建议提前备份或确认路径。
-
组的有效性:
- 目标组必须在系统中存在(通过
/etc/group
文件定义),否则会报错invalid group
。
- 目标组必须在系统中存在(通过
-
符号链接处理:
- 默认操作符号链接时,
chgrp
修改的是符号链接文件本身的组(而非指向的文件)。若需修改目标文件的组,需用-L
选项(跟随符号链接)。
- 默认操作符号链接时,
(四)chgrp
与 chown
的等效操作
# 以下两条命令完全等效
sudo chgrp developers file.txt
sudo chown :developers file.txt
1.3 权限的提升与委派
sudo
与 su
可以提升用户的权限,慎重使用权限!
Ubuntu推荐通过
sudo
提权而非切换到root
用户,以增强安全性。
(一)临时获取root
权限
sudo apt update # 单条命令提权
sudo -i # 切换到root shell(需谨慎)
(二)切换用户
su - username # 完全切换用户环境
exit # 返回原用户
1.4 章尾总结
- 权限模型核心
- 用户、组、其他三类角色与
rwx
权限共同构成访问控制的最小单元,文件与目录的权限行为差异显著(如目录需x
权限方可进入)。
- 用户、组、其他三类角色与
- 核心命令
chmod
:通过符号模式(u/g/o±rwx
)或数字模式(如755
)灵活调整权限。chown
:变更文件所有者与组,支持递归操作(-R
)。chgrp
:专用于调整所属组,等价于chown :组
但更直观。
- 安全实践
- 遵循最小权限原则,避免滥用
777
或-R
递归操作。 - **慎用
sudo
与su
**:优先使用sudo
执行单条特权命令,减少直接切换root
的风险。
- 遵循最小权限原则,避免滥用
- 场景化应用
- 脚本需
+x
执行权限,敏感文件建议600
,共享目录权限常设为770
并绑定组所有权。
- 脚本需
权限即责任,谨慎方得安全。
二、 进程与服务管理
这一小节的工作内容主要体现在查找程序报错方面,尤其是查看工作日志!下面的一些操作,各位老铁千万别随意试着玩,尤其是
kill
进程,可能会导致很麻烦的结果。答应我,别乱搞,除非你清楚你的操作并不影响将来的程序运行!
2.1 进程的查看与监控
2.1.1 ps
:静态查看进程状态
(一)基础概念
ps
命令全称为Process Status,是一个用于查看当前系统进程状态的核心命令,能够提供进程的详细信息,如PID(进程ID)、资源占用、执行命令等,是系统管理和故障排查的重要工具。
(二)基础指令与示例
命令的基本语法指令:
ps [选项]
这个地方指令比较多,也不是很好记,我就给大家举几个经常用得上的ps
指令,如果出现需要其他指令的时候,再进行检索即可,记住基本的操作就够用了。
常见使用示例
# 查看所有进程
ps aux # 显示所有进程及资源占用详情
ps -ef # 完整格式显示进程树及父进程信息
# 查找特定进程(这个使用频率非常高)
ps aux | grep nginx # 查找与nginx相关的进程
pgrep -f abc.py # 通过进程名或命令行快速获取PID(与ps互补)
# 分析资源占用
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 10 # 按CPU排序前10进程
2.1.2 top
/htop
:动态监控进程资源占用
(一)基础概念
top
:实时动态查看系统进程状态及资源占用(CPU、内存、负载),默认集成于所有Linux发行版。htop
:top
的增强版,支持彩色显示、鼠标操作、垂直/水平滚动,需手动安装但交互性更强。
(二)基础指令与示例
top
指令
启动命令:
top # 默认启动,按 q 退出
top -d 2 # 设置刷新间隔为2秒
top -p 1234 # 仅监控PID为1234的进程
- 排序控制(运行时按键):
P
:按CPU占用降序M
:按内存占用降序N
:按PID排序
- 常用交互命令:
k
:终止进程(需输入PID)1
:展开显示所有CPU核心的负载Shift + >
:滚动查看完整命令行
htop
指令
安装与启动:
sudo apt install htop # Ubuntu/Debian安装
htop # 启动(支持鼠标点击操作)
核心优势与操作
- 鼠标交互:
- 点击表头排序(如CPU%、MEM%)
- 拖动进程到其他位置
- 快捷键:
F2
:进入设置菜单F3
:搜索进程F4
:过滤进程名称Space
:标记进程批量操作F9
:发送信号(如终止进程)
(三)使用场景对比
工具 | 优势 | 劣势 | 适用场景 |
---|---|---|---|
top | 无需安装,兼容性强 | 界面单调,操作依赖键盘 | 快速诊断服务器瞬时负载 |
htop | 交互友好,信息丰富 | 需手动安装 | 本地开发机深度分析进程关系 |
(四)常见操作示例
# 生成资源快照(输出到文件)
top -b -n 3 > top_snapshot.txt # 非交互模式运行3次刷新后保存
# 监控特定用户的进程
top -u www-data # 仅显示www-data用户的进程
htop -u mysql # htop过滤mysql用户进程
# 结合watch持续观测
watch -n 2 "top -bn1 | grep nginx" # 每2秒刷新一次nginx进程状态
2.2 进程的生命周期管理
2.2.1 kill
:终止进程( 慎重使用!)
(一)基础概念
kill
是一个用于向进程发送信号的核心命令,通过指定PID或进程名来控制进程的运行状态,从而实现进程的终止、暂停、恢复或重新加载配置等操作。
(二)基本操作与示例
kill
通过发送信号与进程交互,不同信号对应不同操作。默认情况下,kill
发送 SIGTERM(15) 信号,请求进程正常退出;若进程未响应,则需使用 SIGKILL(9) 强制终止。终止其他用户的进程或系统进程需管理员权限sudo
,普通用户只能操作自己的进程。
命令的基本语法指令:
kill [选项] <信号或编号> <PID或进程名>
常见信号作用:
信号名称 | 编号 | 含义 |
---|---|---|
SIGTERM | 15 | 请求终止进程(可被捕获或忽略) |
SIGKILL | 9 | 强制终止进程(立即生效,不可被捕获) |
SIGHUP | 1 | 挂起信号,常用于重新加载配置文件 |
SIGSTOP | 19 | 暂停进程(不可被捕获) |
SIGCONT | 18 | 恢复已暂停的进程 |
常见使用示例
# 终止程序
kill 1234 # 发送SIGTERM(15)信号,要求进程正常退出
kill -9 1234 # 强制杀死PID为1234的进程
# 暂停与恢复进程
kill -SIGSTOP 1234 # 暂停PID为1234的进程
kill -SIGCONT 1234 # 恢复已暂停的进程
# 重新加载配置,适用于守护进程(如Nginx、Apache)的配置热更新
kill -HUP 1234 # 通知进程重新加载配置文件
# 终止多个进程或进程组
kill 1234 5678 # 终止PID为1234和5678的进程
kill -9 -1234 # 杀死PID为1234的进程及其子进程
2.2.2 pkill
/ killall
:按名称批量操作进程
(一)基础概念
pkill
:通过进程名或属性模式匹配发送信号,支持正则表达式和模糊查询,批量操作效率高。killall
:根据 完整进程名 精确匹配进程并发信号,名称需完全一致(区分大小写)。两者均需谨慎使用以避免误杀关键进程。
(二)基本操作与示例
pkill
指令
语法与核心选项:
pkill [选项] <模式>
# 常用选项
-f # 匹配完整命令行(包括参数)
-u USER # 仅匹配指定用户的进程
-SIGNAL # 指定信号(默认 SIGTERM)
常见使用场景:
# 终止所有匹配名称的进程
pkill nginx # 终止所有名为nginx的进程
pkill -9 -f "python3 app.py" # 强制终止包含"python3 app.py"命令的进程
# 按用户过滤操作
pkill -u www-data # 终止www-data用户的所有进程
# 发送自定义信号
pkill -HUP rsyslogd # 通知rsyslogd重新加载配置(等效 kill -HUP)
killall
指令
语法与核心选项:
killall [选项] <进程名>
# 常用选项
-e # 精确匹配长进程名
-i # 交互式确认操作
-SIGNAL # 指定信号(默认 SIGTERM)
常见使用场景:
# 批量终止进程
killall chrome # 终止所有名为chrome的进程
killall -9 mysqld # 强制终止mysqld进程
# 交互式安全操作
killall -i -HUP nginx # 询问确认后重新加载nginx配置
# 精确匹配长名称
killall -e "python3.11" # 仅终止完整名为python3.11的进程
(三)关键注意事项
-
权限要求:
- 终止其他用户或系统进程需
sudo
提权。 - 普通用户仅可操作自身进程。
- 终止其他用户或系统进程需
-
风险控制:
pkill "init"
或killall bash
可能造成系统崩溃,慎用-9
信号。- 建议先通过
pgrep
或ps
验证匹配结果:pgrep -af nginx # 查看将被终止的进程列表
-
工具差异:
特性 pkill
killall
匹配规则 支持正则表达式和模糊匹配 仅匹配完整进程名 跨用户操作 支持 -u
过滤用户默认不区分用户 信号发送灵活性 直接指定信号(如 -HUP
)需用 -s
或-SIGNAL
指定
(四)典型应用场景
-
批量清理僵尸进程:
pkill -9 -u nobody # 强制终止nobody用户的所有无响应进程
-
服务热更新:
killall -HUP haproxy # 重新加载haproxy配置(不中断服务)
-
开发环境快速重启:
pkill -f "npm run dev" && npm run dev # 终止旧进程并重启
注释:
- 优先推荐
pkill
:灵活性强,适合模糊匹配和复杂场景。 - 谨慎使用
killall
:名称精确匹配可能误杀同名进程(如killall init
)。 - 操作铁律:先验证目标进程,再发送最小必要信号(避免直接
-9
)。
2.3 系统服务管理与日志查询
2.3.1 systemctl
:服务管理
(一)基础概念
systemctl
是用于管理和控制 systemd 系统及服务管理器的核心命令行工具。作为现代Linux系统的初始化系统,systemd替代了传统的SysV init
和Upstart
,而 systemctl 整合了旧版 service
和 chkconfig
的功能,提供更高效的服务管理方式。
(二)四大功能
- 服务生命周期管理
负责服务的 启动(start)、停止(stop)、重启(restart)、重载配置(reload) 等操作。
systemctl start nginx.service # 启动Nginx服务
systemctl stop sshd # 停止SSH服务(可省略.service后缀)
- 服务自启配置(这个一定要会!超级常用)
设置服务在系统启动时 自动启用(enable) 或 禁用(disable)。
systemctl enable docker # 启用Docker开机自启
systemctl disable apache2 # 禁止Apache开机自启
- 状态监控与日志
查看服务的实时状态、依赖关系和日志信息。
systemctl status mysql # 显示MySQL的详细状态(含进程PID、运行时间等)
journalctl -u nginx -f # 实时追踪Nginx日志(需结合journalctl)
- 单元文件(Unit)管理
单元文件(Unit File) 是systemd管理资源的基础,包括服务(.service)、挂载点(.mount)、定时器(.timer)等。其支持自定义单元文件。
systemctl edit nginx.service # 扩展或覆盖默认服务配置
systemctl daemon-reload # 重载修改后的单元文件(超级关键的操作)
2.3.1 journalctl
:查看系统日志
(一)基础概念
journalctl
是用于管理和查询 systemd
日志系统 的核心命令行工具。它是 systemd
生态的一部分,替代了传统分散的日志管理方式,提供统一、结构化的日志查询和分析功能。
(二)基本操作与示例
常见使用示例
# 服务故障排查
journalctl -u sshd -p err --since "today" # 查看 SSH 服务的错误日志
journalctl -u docker.service -f # 实时追踪 Docker 容器日志
# 系统启动问题分析
journalctl -b # 显示本次启动的日志
journalctl -k # 查看内核启动消息
# 性能监控
journalctl --since "1 hour ago" | grep "high CPU" # 按 CPU 使用率筛选高负载进程日志
journalctl --since "1 hour ago" -p err -o json > error_logs.json # 导出最近 1 小时的错误日志为 JSON
2.4 章尾总结
这部分工作在实际操作中非常重要且使用频率非常高,各位看官老爷可进行深度学习,有些关键操作在不够了解的情况下,千万不要随意尝试,很容易造成崩溃!
关键命令总结
操作 | 命令 |
---|---|
静态查看进程状态 | ps |
动态监控进程资源占用 | top / htop |
终止进程 | kill |
按名称批量操作进程 | pkill / killall |
服务管理 | systemctl |
查看系统日志 | journalctl |
能够看到这里的观众老爷,无疑是对up的最大肯定和支持,在此恳求各位观众老爷能够多多点赞、收藏和关注(强烈推荐大家关注一下up主和新建的这个合集“Ubuntu系统教学系列”)。在这个合集中,未来将持续给大家分享关于Ubuntu系统生态中的多种常见开发实用操作。未来也将继续分享Docker、conda、ROS等等各种实用干货。感谢大家支持!
往期回顾 — 专栏 “Ubuntu系统教学系列”
专栏: Ubuntu系统教学系列
Ubuntu教学系列(一):安装win11+Ubuntu双系统并配置Ubuntu常用软件
Ubuntu教学系列(二):安装微信和QQ通讯软件以及输入法
Ubuntu教学系列(三): “高频率” 终端命令行指令操作