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

字段说明:

  1. 用户名
  2. 密码占位符(x表示密码在/etc/shadow)
  3. UID
  4. 主组GID
  5. 注释(通常是全名)
  6. 主目录
  7. 登录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远程连接
  • 了解防火墙配置

练习题:

  1. 创建一个用户并添加到sudo组
  2. 找出CPU占用最高的5个进程
  3. 创建一个systemd服务运行自己的脚本
  4. 使用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 &

💡 提示: 用户和进程管理是系统管理的核心,熟练掌握这些命令能大大提升工作效率!