Linux 文件权限进阶与进程管理
核心内容:umask 默认权限掩码 | 特殊权限 SUID/SGID/Sticky | 文件扩展属性 | 进程基础与状态 | 进程查看与作业控制 | 进程信号 | 僵尸/孤儿进程
文章目录
- Linux 文件权限进阶与进程管理
- 一、文件默认权限:umask 掩码
- 1. 核心作用
- 2. 计算示例
- 3. 常用操作
- 二、文件特殊权限(SUID / SGID / Sticky)
- 核心对照表
- 1. SUID 详解
- 2. SGID 详解
- 3. Sticky 粘滞位详解
- 4. 设置与查找
- 三、文件扩展属性:chattr
- 1. 两个核心属性
- 2. 常用操作
- 四、进程基础概念
- 1. 核心定义
- 2. 进程的组成
- 3. 进程的产生:fork 机制
- 五、进程状态
- 状态对照表
- 状态转换流程
- 六、进程查看命令:ps
- 1. 常用组合
- 2. 筛选进程
- 3. 关键字段说明
- 七、前后台进程与作业控制
- 1. 前台 vs 后台
- 2. 作业控制命令
- 3. 脱离终端运行
- (1)nohup
- (2)screen
- 八、进程信号
- 常用核心信号
- 信号发送命令
- (1)kill
- (2)pkill / pgrep
- 九、特殊进程:僵尸进程与孤儿进程
- 1. 僵尸进程
- 产生原因
- 解决方法
- 2. 孤儿进程
- 产生原因
- 对比总结
一、文件默认权限:umask 掩码
1. 核心作用
umask 是新建文件/目录时要剔除的权限,用来控制系统默认创建文件的权限。
- 目录默认最大权限:
777 (rwxrwxrwx) - 文件默认最大权限:
666 (rw-rw-rw-)(文件默认不赋予执行权限,出于安全考虑) - 最终权限 = 最大默认权限 - umask 掩码权限
2. 计算示例
系统默认 umask 为0022:
- 新建目录:777 - 022 = 755 →
drwxr-xr-x - 新建文件:666 - 022 = 644 →
-rw-r--r--
3. 常用操作
# 查看当前umask值umask# 临时设置(当前终端生效)umask077# 新建文件仅用户自己可读写,组和其他无任何权限# 永久生效# 单个用户:写入 ~/.bashrcecho'umask 077'>>~/.bashrc# 所有用户:写入 /etc/bashrcecho'umask 077'>>/etc/bashrc二、文件特殊权限(SUID / SGID / Sticky)
基础 rwx 之外的三种特殊权限,用于实现特定的权限功能,对应位置在权限位的最前面。
核心对照表
| 特殊权限 | 对文件的影响 | 对目录的影响 | 典型示例 | 数字值 |
|---|---|---|---|---|
| SUID(u+s) | 执行可执行文件时,以文件所有者的身份运行,而非执行者身份 | 无影响 | /usr/bin/passwd(普通用户修改密码时临时获得root权限) | 4 |
| SGID(g+s) | 执行可执行文件时,以文件所属组的身份运行 | 目录内新建的文件/子目录,自动继承该目录的组所有者 | /run/log/journal(日志目录,保证日志文件统一归属日志组) | 2 |
| Sticky(o+t) | 无影响 | 对目录有写权限的用户,只能删除自己拥有的文件,无法删除他人文件 | /tmp(公共临时目录,防止用户随意删除他人文件) | 1 |
1. SUID 详解
- 仅对可执行的二进制文件有效,对脚本、目录无效。
- 权限位表现:用户执行位的
x变成s,如-rwsr-xr-x。 - 风险:如果给 vim、bash 等工具加 SUID,普通用户可以直接获得 root 权限,属于高危操作。
2. SGID 详解
- 对目录:是团队协作的常用手段,确保同组用户在目录下创建的文件都属于同一个组,方便共享。
- 权限位表现:组执行位的
x变成s,如drwxrwsr-x。
3. Sticky 粘滞位详解
- 仅对目录生效,是公共目录的安全机制。
- 权限位表现:其他用户执行位的
x变成t,如drwxrwxrwt。
4. 设置与查找
# 添加SUIDchmodu+s /usr/bin/vim# 添加SGIDchmodg+s /data/webapp# 添加Stickychmodo+t /tmp# 数字方式设置(4=SUID 2=SGID 1=Sticky,放在三位权限前)chmod4755file# SUID + 755chmod2775dir# SGID + 775chmod1777tmpdir# Sticky + 777# 查找系统中所有带SUID的文件find/-perm-4000三、文件扩展属性:chattr
比基础权限更底层的文件属性,root 用户也受约束,用于保护关键文件不被修改/删除。
1. 两个核心属性
| 属性 | 作用 | 适用场景 |
|---|---|---|
i(immutable) | 不可变更:文件不能修改、删除、重命名,不能追加内容 | 保护系统关键配置文件,防止误改误删 |
a(append only) | 仅追加:只能在文件末尾追加内容,不能覆盖、删除 | 日志文件,保证日志只能新增不能篡改 |
2. 常用操作
# 添加i属性(锁定文件)chattr +i /etc/passwd.bak# 移除i属性chattr-i/etc/passwd.bak# 添加a属性chattr +a /var/log/operator.log# 查看文件扩展属性lsattr /etc/passwd.bak注意:扩展属性高于常规权限,即使是 root 用户,给文件加了
i属性后也无法修改删除,必须先移除属性。
四、进程基础概念
1. 核心定义
- 程序:静态的可执行文件,存储在磁盘上。
- 进程:运行起来的程序,是程序的运行实例,占用 CPU、内存等系统资源。
- 线程:进程内的执行单元,一个进程可以有多个线程。
2. 进程的组成
- 独立的内存地址空间
- 安全属性(所有者、权限)
- 一个或多个执行线程
- 进程状态
- 环境变量、文件描述符等资源
3. 进程的产生:fork 机制
Linux 中所有进程都是通过fork复制创建的:
- 父进程调用 fork,复制出一个子进程
- 子进程通过
exec加载新的程序代码运行 - 子进程退出时,向父进程发送信号,由父进程回收状态
系统中所有进程的祖先是 PID=1 的
systemd进程(CentOS7+)。
五、进程状态
Linux 进程有多种状态,在不同条件间转换,核心状态如下:
状态对照表
| 状态标识 | 状态名称 | 内核定义 | 说明 |
|---|---|---|---|
| R | 运行/就绪态 | TASK_RUNNING | 正在CPU上执行,或在就绪队列等待调度 |
| S | 可中断睡眠 | TASK_INTERRUPTIBLE | 等待事件/资源,收到信号可以唤醒 |
| D | 不可中断睡眠 | TASK_UNINTERRUPTIBLE | 等待硬件IO,不响应信号,保证IO过程不被打断 |
| T | 停止态 | TASK_STOPPED | 被暂停,收到CONT信号可恢复 |
| Z | 僵尸态 | EXIT_ZOMB | 子进程已退出,但父进程未回收其退出状态,仅保留PID等信息 |
| X | 销毁态 | EXIT_DEAD | 父进程回收完成,进程彻底释放,系统中不可见 |
状态转换流程
新建 → 就绪(R) ←→ 运行(R) → 退出 → 僵尸(Z) → 回收(X) ↑ ↓ 睡眠(S/D/T)- 运行中的进程调用系统调用、等待资源时,进入睡眠状态
- 睡眠的进程等待的事件到达时,回到就绪态
- 收到停止信号进入T状态,收到继续信号恢复
六、进程查看命令:ps
ps 是查看系统进程信息的核心命令,支持多种筛选和输出格式。
1. 常用组合
# 查看所有进程(简略)ps-e# 查看所有进程(详细信息,UID/PID/PPID/启动时间)ps-ef# 查看所有进程(BSD风格,含CPU/内存占用)psaux# 树形显示进程父子关系psaxf# 自定义输出列ps-opid,%cpu,%mem,command2. 筛选进程
# 查看指定用户的进程ps-uhero# 查看指定终端的进程ps-tpts/0# 按名称筛选ps-Cnginx# 按CPU使用率降序排序psaux--sort-%cpu3. 关键字段说明
PID:进程ID,唯一标识PPID:父进程ID%CPU:CPU使用率%MEM:内存使用率TTY:进程所属终端,?表示后台守护进程STAT:进程状态TIME:进程累计占用CPU的时间COMMAND:进程名称
七、前后台进程与作业控制
1. 前台 vs 后台
| 类型 | 特点 |
|---|---|
| 前台进程 | 占用终端,可接收键盘输入,一个终端同一时间只有一个前台进程 |
| 后台进程 | 不占用终端,无法接收键盘输入,在后台静默运行 |
2. 作业控制命令
# 后台启动sleep进程300秒,启动了一个专门用来休眠300秒的进程sleep300&# 查看当前终端的后台作业jobs# 暂停前台进程(Ctrl+Z)# 把正在运行的前台进程暂停,放到后台停止状态# 将作业切到前台运行fg%1# %1 是jobs里的作业编号# 将暂停的作业放到后台继续运行bg%23. 脱离终端运行
终端关闭时,后台进程会收到HUP信号终止,需要工具让进程脱离终端:
(1)nohup
让进程忽略终端挂起信号,终端关闭后继续运行:
nohup./study.sh&(2)screen
虚拟终端工具,创建独立的终端会话,关闭真实终端不影响:
# 新建screen会话screen# 列出所有screen会话screen-ls# 重新连接会话screen-r会话ID# 退出并关闭会话exit八、进程信号
信号是发给进程的软中断,用来通知进程发生了特定事件,进程可以响应、忽略或被强制终止。
常用核心信号
| 编号 | 名称 | 含义 | 触发方式 | 特点 |
|---|---|---|---|---|
| 1 | HUP | 挂起/重载 | 终端关闭、手动发送 | 通常用于让服务重新加载配置,不终止进程 |
| 2 | INT | 中断 | Ctrl+C | 终止前台进程,可被拦截 |
| 3 | QUIT | 退出 | Ctrl+\ | 终止进程并生成转储文件 |
| 9 | KILL | 强制杀死 | 手动发送 | 不可拦截、不可忽略,必定终止进程 |
| 15 | TERM | 终止 | kill默认信号 | 友好终止,允许进程清理资源后退出,可拦截 |
| 18 | CONT | 继续 | 手动发送 | 恢复暂停的进程,不可拦截 |
| 19 | STOP | 停止 | 手动发送 | 强制暂停,不可拦截 |
| 20 | TSTP | 终端停止 | Ctrl+Z | 暂停前台进程,可拦截 |
信号发送命令
(1)kill
按 PID 或作业号给单个进程发信号:
# 默认发15号TERM信号,终止进程kill1234# 指定信号kill-91234# 强制杀死kill-STOP%1# 暂停作业1kill-CONT%1# 恢复作业1(2)pkill / pgrep
按进程名、用户、终端批量操作:
# 按名称查找进程PIDpgrepsleep# 按名称批量终止进程pkillsleep# 终止指定用户的所有进程pkill-ulaoma# 终止指定终端的所有进程pkill-tpts/0九、特殊进程:僵尸进程与孤儿进程
1. 僵尸进程
产生原因
子进程执行完毕退出后,父进程没有调用 wait 回收其退出状态,子进程就会进入 Z 状态,成为僵尸进程。
- 僵尸进程已经释放了内存、文件等资源,只保留 PID、退出状态等少量信息。
- 大量僵尸进程会占用 PID 号,导致系统无法创建新进程。
解决方法
- 找到并终止父进程,僵尸进程会被 systemd 领养回收
- 修复父进程代码,添加 wait 逻辑回收子进程
2. 孤儿进程
产生原因
父进程先退出,子进程还在运行,子进程就成为孤儿进程。
- 孤儿进程会被 PID=1 的 systemd 进程领养,由 systemd 负责回收其退出状态。
- 孤儿进程本身没有危害,只是父进程变成了1号进程。
对比总结
| 类型 | 产生原因 | 状态 | 危害 | 处理方式 |
|---|---|---|---|---|
| 僵尸进程 | 子进程先退,父进程不回收 | Z状态 | 占用PID,大量存在影响系统 | 终止父进程,或修复父进程回收逻辑 |
| 孤儿进程 | 父进程先退,子进程存活 | 正常运行 | 无直接危害 | 无需特殊处理,由systemd托管 |