Linux教程 / 第 80 节
第8章:用户与进程管理
掌握用户管理和进程控制,提升系统运维能力
本章目标
- 理解Linux用户和组的概念
- 掌握用户管理命令(useradd、usermod等)
- 学会进程查看和控制(ps、top、kill等)
- 能够管理后台任务和系统服务
8.1 用户管理基础
8.1.1 用户系统概述
Linux是多用户系统,每个用户有:
- UID (User ID): 用户唯一标识
- GID (Group ID): 主组标识
- 主目录: 通常在
/home/username - Shell: 登录后的命令解释器
特殊用户:
root: UID=0,超级管理员- 系统用户: UID<1000,运行系统服务
- 普通用户: UID≥1000
8.1.2 用户信息文件
/etc/passwd: 用户账户信息
cat /etc/passwd
# username:x:UID:GID:comment:home:shell
# alice:x:1000:1000:Alice Smith:/home/alice:/bin/bash
字段说明:
- 用户名
- 密码占位符(x表示密码在/etc/shadow)
- UID
- 主组GID
- 注释(通常是全名)
- 主目录
- 登录Shell
/etc/shadow: 加密密码(需要root权限)
sudo cat /etc/shadow
# username:encrypted_password:last_change:min:max:warn:inactive:expire
/etc/group: 组信息
cat /etc/group
# groupname:x:GID:members
# developers:x:1001:alice,bob,charlie
8.2 查看用户信息
8.2.1 当前用户信息
# 显示当前用户名
whoami
# 显示当前用户ID和组ID
id
# uid=1000(alice) gid=1000(alice) groups=1000(alice),27(sudo),1001(developers)
# 显示指定用户信息
id bob
# 显示当前登录用户
who
# 显示详细登录信息
w
8.2.2 查看用户详细信息
# 查看用户的组
groups alice
# 查看用户的详细信息
finger alice # 需要安装finger包
# 查看用户的登录历史
last alice
# 查看失败的登录尝试
sudo lastb
8.3 用户管理命令
8.3.1 创建用户 - useradd
# 基本创建用户
sudo useradd username
# 创建用户并指定主目录
sudo useradd -m -d /home/username username
# 创建用户并指定Shell
sudo useradd -m -s /bin/bash username
# 创建用户并指定UID
sudo useradd -m -u 1500 username
# 创建用户并添加到组
sudo useradd -m -G developers,docker username
# 完整示例:创建开发用户
sudo useradd -m -s /bin/bash -c "Developer Account" -G sudo,developers devuser
常用选项:
-m: 创建主目录-s: 指定Shell-c: 添加注释-G: 指定附加组-u: 指定UID-d: 指定主目录路径
8.3.2 设置密码 - passwd
# 设置当前用户密码
passwd
# 设置其他用户密码(需要root)
sudo passwd username
# 删除用户密码(不安全!)
sudo passwd -d username
# 锁定用户账户
sudo passwd -l username
# 解锁用户账户
sudo passwd -u username
# 强制用户下次登录修改密码
sudo passwd -e username
8.3.3 修改用户 - usermod
# 修改用户名
sudo usermod -l newname oldname
# 修改主目录
sudo usermod -d /new/home -m username
# 修改Shell
sudo usermod -s /bin/zsh username
# 添加用户到组
sudo usermod -aG groupname username
# 修改用户的主组
sudo usermod -g newgroup username
# 锁定用户
sudo usermod -L username
# 解锁用户
sudo usermod -U username
实战场景: 给用户添加sudo权限
# 方法1: 添加到sudo组
sudo usermod -aG sudo username
# 方法2: 编辑sudoers文件
sudo visudo
# 添加: username ALL=(ALL:ALL) ALL
8.3.4 删除用户 - userdel
# 删除用户(保留主目录)
sudo userdel username
# 删除用户及其主目录
sudo userdel -r username
# 强制删除(即使用户已登录)
sudo userdel -f username
⚠️ 警告: 删除用户前确保备份重要数据!
8.4 组管理
8.4.1 创建和删除组
# 创建组
sudo groupadd developers
# 创建组并指定GID
sudo groupadd -g 1500 developers
# 删除组
sudo groupdel developers
8.4.2 管理组成员
# 添加用户到组
sudo usermod -aG groupname username
# 或使用gpasswd
sudo gpasswd -a username groupname
# 从组中移除用户
sudo gpasswd -d username groupname
# 查看组成员
getent group groupname
8.4.3 修改组
# 修改组名
sudo groupmod -n newname oldname
# 修改GID
sudo groupmod -g 1600 groupname
实战场景: 创建开发团队组
# 1. 创建组
sudo groupadd developers
# 2. 添加成员
sudo usermod -aG developers alice
sudo usermod -aG developers bob
sudo usermod -aG developers charlie
# 3. 创建共享目录
sudo mkdir /opt/team-project
sudo chown :developers /opt/team-project
sudo chmod 2775 /opt/team-project
# 4. 验证
getent group developers
# developers:x:1001:alice,bob,charlie
8.5 进程管理基础
8.5.1 什么是进程
进程是正在运行的程序实例,每个进程有:
- PID (Process ID): 进程唯一标识
- PPID (Parent PID): 父进程ID
- 状态: 运行、睡眠、停止、僵尸等
- 优先级: 决定CPU分配
- 资源: CPU、内存、文件等
8.5.2 查看进程 - ps
# 查看当前终端的进程
ps
# 查看所有进程(BSD风格)
ps aux
# 查看所有进程(System V风格)
ps -ef
# 查看进程树
ps auxf
# 或
pstree
# 查看特定用户的进程
ps -u username
# 查看特定进程
ps -p PID
# 按内存使用排序
ps aux --sort=-%mem | head
# 按CPU使用排序
ps aux --sort=-%cpu | head
输出字段说明:
ps aux
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# alice 1234 0.5 2.1 123456 12345 ? S 10:00 0:05 /usr/bin/python3
USER: 进程所有者PID: 进程ID%CPU: CPU使用率%MEM: 内存使用率VSZ: 虚拟内存大小(KB)RSS: 物理内存大小(KB)TTY: 终端STAT: 状态(R=运行,S=睡眠,Z=僵尸)START: 启动时间TIME: CPU时间COMMAND: 命令
8.5.3 实时监控 - top
# 启动top
top
# 常用快捷键:
# q: 退出
# h: 帮助
# k: 杀死进程(输入PID)
# M: 按内存排序
# P: 按CPU排序
# u: 过滤用户
# 1: 显示所有CPU核心
top界面说明:
top - 10:30:00 up 5 days, 2:15, 3 users, load average: 0.50, 0.40, 0.30
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 8000.0 total, 2000.0 free, 4000.0 used, 2000.0 buff/cache
MiB Swap: 2000.0 total, 2000.0 free, 0.0 used. 3500.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 alice 20 0 123456 12345 1234 S 5.0 2.1 0:05.00 python3
8.5.4 增强版监控 - htop
# 安装htop
sudo apt-get install htop # Ubuntu/Debian
sudo yum install htop # CentOS/RHEL
# 运行htop
htop
# 优势:
# - 彩色界面
# - 鼠标支持
# - 更直观的操作
# - 树形视图
8.6 进程控制
8.6.1 终止进程 - kill
# 优雅终止进程(SIGTERM)
kill PID
# 强制终止进程(SIGKILL)
kill -9 PID
# 重新加载配置(SIGHUP)
kill -HUP PID
# 终止所有同名进程
killall process_name
# 按名称终止进程
pkill process_name
# 按用户终止所有进程
pkill -u username
常用信号:
SIGTERM (15): 优雅终止(默认)SIGKILL (9): 强制终止(无法捕获)SIGHUP (1): 重新加载配置SIGSTOP (19): 暂停进程SIGCONT (18): 继续进程
实战场景: 终止卡死的进程
# 1. 找到进程PID
ps aux | grep process_name
# 2. 尝试优雅终止
kill 1234
# 3. 等待5秒,如果还在运行
sleep 5
# 4. 强制终止
kill -9 1234
8.6.2 后台运行进程
# 在后台运行命令
command &
# 示例:后台运行脚本
./long-running-script.sh &
# [1] 1234 (作业号和PID)
# 查看后台作业
jobs
# 将前台进程放到后台
# Ctrl+Z (暂停)
# bg (后台继续)
# 将后台作业调到前台
fg %1 # 1是作业号
# 示例:
sleep 100 &
jobs
# [1]+ Running sleep 100 &
fg %1
# 现在sleep在前台运行
8.6.3 nohup - 忽略挂断信号
# 后台运行,忽略终端关闭
nohup command &
# 输出重定向到文件
nohup ./script.sh > output.log 2>&1 &
# 查看输出
tail -f nohup.out
# 实战示例:部署后台服务
nohup java -jar app.jar > app.log 2>&1 &
echo $! > app.pid # 保存PID到文件
8.7 系统资源监控
8.7.1 内存使用 - free
# 查看内存使用
free
# 以人类可读格式显示
free -h
# 输出示例:
# total used free shared buff/cache available
# Mem: 7.8G 3.2G 1.5G 256M 3.1G 4.1G
# Swap: 2.0G 0B 2.0G
8.7.2 磁盘使用 - df
# 查看磁盘使用
df -h
# 查看inode使用
df -i
# 查看特定文件系统
df -h /home
8.7.3 目录大小 - du
# 查看当前目录大小
du -sh .
# 查看子目录大小
du -sh *
# 查看前10个最大目录
du -sh * | sort -hr | head -10
# 查看指定深度
du -h --max-depth=1 /var/log
8.7.4 系统负载 - uptime
# 查看系统运行时间和负载
uptime
# 10:30:00 up 5 days, 2:15, 3 users, load average: 0.50, 0.40, 0.30
# 1分钟 5分钟 15分钟
负载解读:
- 负载 < CPU核心数: 系统正常
- 负载 = CPU核心数: 系统满负荷
- 负载 > CPU核心数: 系统过载
8.8 系统服务管理 - systemd
8.8.1 systemctl基本命令
# 启动服务
sudo systemctl start nginx
# 停止服务
sudo systemctl stop nginx
# 重启服务
sudo systemctl restart nginx
# 重新加载配置(不中断服务)
sudo systemctl reload nginx
# 查看服务状态
systemctl status nginx
# 开机自启
sudo systemctl enable nginx
# 禁用开机自启
sudo systemctl disable nginx
# 查看是否开机自启
systemctl is-enabled nginx
# 查看所有服务
systemctl list-units --type=service
# 查看失败的服务
systemctl --failed
8.8.2 查看服务日志
# 查看服务日志
sudo journalctl -u nginx
# 实时查看日志
sudo journalctl -u nginx -f
# 查看最近100行
sudo journalctl -u nginx -n 100
# 查看今天的日志
sudo journalctl -u nginx --since today
# 查看指定时间范围
sudo journalctl -u nginx --since "2026-01-13 10:00" --until "2026-01-13 11:00"
8.8.3 创建自定义服务
示例: 创建Node.js应用服务
# 1. 创建服务文件
sudo nano /etc/systemd/system/myapp.service
[Unit]
Description=My Node.js Application
After=network.target
[Service]
Type=simple
User=nodeapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node /opt/myapp/server.js
Restart=on-failure
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=myapp
[Install]
WantedBy=multi-user.target
# 2. 重新加载systemd配置
sudo systemctl daemon-reload
# 3. 启动服务
sudo systemctl start myapp
# 4. 查看状态
systemctl status myapp
# 5. 设置开机自启
sudo systemctl enable myapp
# 6. 查看日志
sudo journalctl -u myapp -f
8.9 实战场景
场景1: 创建部署用户
# 1. 创建用户
sudo useradd -m -s /bin/bash -c "Deployment User" deploy
# 2. 设置密码
sudo passwd deploy
# 3. 添加sudo权限(可选)
sudo usermod -aG sudo deploy
# 4. 配置SSH密钥登录
sudo -u deploy mkdir /home/deploy/.ssh
sudo -u deploy chmod 700 /home/deploy/.ssh
sudo -u deploy touch /home/deploy/.ssh/authorized_keys
sudo -u deploy chmod 600 /home/deploy/.ssh/authorized_keys
# 5. 添加公钥
echo "ssh-rsa AAAAB3..." | sudo tee -a /home/deploy/.ssh/authorized_keys
# 6. 测试登录
ssh deploy@server
场景2: 监控高CPU进程
# 1. 找出CPU占用最高的进程
ps aux --sort=-%cpu | head -10
# 2. 实时监控
top -o %CPU
# 3. 查看进程详细信息
ps -p PID -o pid,ppid,cmd,%cpu,%mem,etime
# 4. 查看进程打开的文件
lsof -p PID
# 5. 如果需要终止
kill PID
场景3: 清理僵尸进程
# 1. 查找僵尸进程
ps aux | grep 'Z'
# 2. 找到父进程
ps -o ppid= -p ZOMBIE_PID
# 3. 终止父进程(谨慎!)
kill PARENT_PID
# 4. 如果父进程是init/systemd,重启系统
sudo reboot
场景4: 部署Web应用
# 1. 创建应用用户
sudo useradd -m -s /bin/bash webapp
# 2. 创建应用目录
sudo mkdir -p /opt/webapp
sudo chown webapp:webapp /opt/webapp
# 3. 部署代码
sudo -u webapp git clone https://github.com/user/app.git /opt/webapp
# 4. 安装依赖
cd /opt/webapp
sudo -u webapp npm install
# 5. 创建systemd服务
sudo nano /etc/systemd/system/webapp.service
# 6. 启动服务
sudo systemctl daemon-reload
sudo systemctl start webapp
sudo systemctl enable webapp
# 7. 验证
systemctl status webapp
curl http://localhost:3000
场景5: 用户权限审计
# 1. 查看所有sudo用户
getent group sudo
# 2. 查看所有UID=0的用户(root权限)
awk -F: '$3 == 0 {print $1}' /etc/passwd
# 3. 查看最近登录的用户
last | head -20
# 4. 查看失败的登录尝试
sudo lastb | head -20
# 5. 查看当前登录用户
w
# 6. 查看用户的sudo历史
sudo grep sudo /var/log/auth.log
8.10 性能调优
8.10.1 进程优先级 - nice
# 以低优先级运行命令
nice -n 10 command
# 修改运行中进程的优先级
renice -n 5 -p PID
# nice值范围: -20(最高优先级)到19(最低优先级)
# 普通用户只能降低优先级(增加nice值)
# root可以提高优先级(减少nice值)
8.10.2 CPU亲和性
# 将进程绑定到特定CPU核心
taskset -c 0,1 command # 绑定到核心0和1
# 查看进程的CPU亲和性
taskset -p PID
# 修改运行中进程的CPU亲和性
taskset -cp 0,1 PID
8.10.3 限制资源 - ulimit
# 查看当前限制
ulimit -a
# 限制最大打开文件数
ulimit -n 4096
# 限制最大进程数
ulimit -u 1024
# 限制最大内存(KB)
ulimit -m 1048576
# 永久设置(编辑/etc/security/limits.conf)
sudo nano /etc/security/limits.conf
# username soft nofile 4096
# username hard nofile 8192
8.11 常见问题
Q1: 如何切换到其他用户?
A:
# 切换到其他用户(需要密码)
su - username
# 以其他用户身份执行命令
sudo -u username command
# 切换到root
sudo -i
Q2: 如何查看某个端口被哪个进程占用?
A:
# 方法1: netstat
sudo netstat -tulpn | grep :8080
# 方法2: lsof
sudo lsof -i :8080
# 方法3: ss
sudo ss -tulpn | grep :8080
Q3: 进程无法kill -9怎么办?
A:
- 检查进程状态(ps aux | grep PID)
- 如果状态是
D(不可中断睡眠),等待IO完成 - 如果是僵尸进程
Z,终止父进程 - 最后手段:重启系统
Q4: 如何限制用户的资源使用?
A: 使用cgroups或systemd资源控制:
# systemd服务资源限制
[Service]
MemoryLimit=512M
CPUQuota=50%
Q5: 如何找到占用磁盘空间最多的文件?
A:
# 查找大文件(>100MB)
sudo find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
# 查看目录占用
sudo du -h --max-depth=1 / | sort -hr | head -10
本章总结
用户管理核心命令
| 命令 | 用途 | 示例 |
|---|---|---|
useradd | 创建用户 | sudo useradd -m username |
passwd | 设置密码 | sudo passwd username |
usermod | 修改用户 | sudo usermod -aG group user |
userdel | 删除用户 | sudo userdel -r username |
groupadd | 创建组 | sudo groupadd developers |
进程管理核心命令
| 命令 | 用途 | 示例 |
|---|---|---|
ps | 查看进程 | ps aux |
top | 实时监控 | top |
kill | 终止进程 | kill -9 PID |
systemctl | 服务管理 | systemctl status nginx |
journalctl | 查看日志 | journalctl -u nginx -f |
关键概念
- UID/GID: 用户和组的唯一标识
- PID: 进程唯一标识
- 信号: 进程间通信机制
- systemd: 现代Linux的初始化系统
下一步
- 学习网络基础命令(第12章)
- 掌握SSH远程连接
- 了解防火墙配置
练习题:
- 创建一个用户并添加到sudo组
- 找出CPU占用最高的5个进程
- 创建一个systemd服务运行自己的脚本
- 使用nohup后台运行一个长时间任务
参考答案:
# 1.
sudo useradd -m -s /bin/bash testuser
sudo usermod -aG sudo testuser
# 2.
ps aux --sort=-%cpu | head -6
# 3.
sudo nano /etc/systemd/system/myscript.service
# (编写服务文件)
sudo systemctl daemon-reload
sudo systemctl start myscript
# 4.
nohup ./long-task.sh > task.log 2>&1 &
💡 提示: 用户和进程管理是系统管理的核心,熟练掌握这些命令能大大提升工作效率!