Linux 常用命令整理(二):系统管理与权限

2023-08-26 Linux 运维

本文整理 Linux 系统管理相关的常用命令,涵盖进程管理、用户权限、磁盘监控和服务管理。这些命令是日常运维和排查问题的核心工具。

一、权限管理

chmod — 修改文件权限

Linux 权限使用 9 位三位一组表示:所有者(u) / 所属组(g) / 其他人(o)

chmod 755 script.sh            # 数字法:rwxr-xr-x
chmod u+x script.sh            # 给所有者加执行权限
chmod g+w file.txt             # 给组加写权限
chmod o-r file.txt             # 移除其他人的读权限
chmod -R 755 dir/              # 递归修改目录及内部文件

常用权限速查表:

数字 权限 说明
755 rwxr-xr-x 程序文件、目录(常用)
644 rw-r--r-- 普通文本文件(常用)
600 rw------- 私密文件(SSH密钥等)
700 rwx------ 私密目录
777 rwxrwxrwx ❌ 危险,慎用

chown — 修改文件所有者

chown user:group file.txt      # 同时修改所有者和组
chown user file.txt            # 只修改所有者
chown :group file.txt          # 只修改所属组
chown -R user:group dir/       # 递归修改

示例: 修复 Web 目录权限

chown -R www-data:www-data /var/www/html/
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

chgrp — 修改文件所属组

chgrp devteam project/         # 修改目录所属组
chgrp -R devteam project/      # 递归修改

umask — 设置默认权限掩码

umask                         # 查看当前掩码(如 0022)
umask 0022                    # 文件默认 644,目录默认 755
umask 0007                    # 文件默认 660,目录默认 770

💡 默认文件权限 = 666 - umask,目录权限 = 777 - umask

useradd / adduser — 创建用户

useradd -m -s /bin/bash username         # 创建用户并创建家目录
useradd -m -G sudo,docker username       # 创建用户并加入附加组
adduser username                          # 交互式创建(更友好)

💡 useradd 是底层命令(Debian 上不会自动创建家目录),adduser 是带交互的增强版。

passwd — 设置密码

passwd                         # 修改当前用户密码
passwd username                # 修改指定用户密码
passwd -l username             # 锁定用户
passwd -u username             # 解锁用户
passwd -S username             # 查看密码状态

usermod — 修改用户属性

usermod -aG sudo username              # 将用户加入 sudo 组
usermod -aG docker username            # 将用户加入 docker 组
usermod -l newname oldname             # 修改用户名
usermod -d /new/home -m username       # 移动家目录

⚠️ -a(append)使用 -G 时必须加,否则会移除用户不在列表中的其他组!

userdel — 删除用户

userdel username               # 删除用户
userdel -r username            # 删除用户及其家目录和邮件池

id — 查看用户信息

id                            # 查看当前用户 UID、GID、所属组
id username                   # 查看指定用户

groups — 查看用户所属组

groups                        # 查看当前用户所属组
groups username               # 查看指定用户

sudo — 以超级权限执行

sudo command                  # 以 root 执行命令
sudo -i                       # 切换到 root shell
sudo -u www-data command      # 以指定用户执行
sudo -l                       # 查看当前用户可执行的 sudo 命令

💡 visudo 编辑 /etc/sudoers 配置文件,比直接编辑更安全(语法检查)。

su — 切换用户

su - username                 # 切换到指定用户并加载环境变量
su username                   # 切换但不加载环境
su -                          # 切换到 root

二、进程管理

ps — 查看进程

ps aux                        # 查看所有进程(BSD格式)
ps -ef                        # 查看所有进程(标准格式)
ps aux | grep nginx           # 查找特定进程
ps aux --sort=-%mem           # 按内存使用排序
ps aux --sort=-%cpu | head    # 按 CPU 使用排序

输出示例解释:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3 169172 13704 ?        Ss   08:00   0:01 systemd
字段 含义
PID 进程 ID
%CPU CPU 使用率
%MEM 内存使用率
RSS 实际物理内存占用 (KB)
STAT 进程状态(S=睡眠, R=运行, Z=僵尸)
TIME 累计 CPU 时间

top / htop — 动态进程监控

top                           # 实时进程监控
# 交互命令:
#   P    按 CPU 排序
#   M    按内存排序
#   k    杀死进程
#   q    退出
htop                          # 增强版(需安装)

💡 htop 比 top 更直观:彩色显示、可鼠标操作、更易读的进程树。

kill — 终止进程

kill PID                      # 发送 SIGTERM(优雅终止)
kill -9 PID                   # 发送 SIGKILL(强制终止)
kill -15 PID                  # 发送 SIGTERM(默认)
kill -1 PID                   # 发送 SIGHUP(重载配置)
killall nginx                 # 杀死所有 nginx 进程
pkill -f "python app.py"      # 按进程名匹配杀死

信号优先级(由轻到重):

  1. SIGTERM (15) — 请求终止,程序可自行清理
  2. SIGHUP (1) — 重载配置(Nginx/SSH 等常用)
  3. SIGKILL (9) — 强制终止,无法被捕获

nohup — 后台运行不受终端退出影响

nohup python script.py &          # 后台运行,输出到 nohup.out
nohup python script.py > log.out 2>&1 &  # 指定输出文件

jobs / fg / bg — 作业控制

jobs                          # 查看后台作业
fg %1                         # 将作业 1 放到前台
bg %1                         # 将作业 1 放到后台继续运行
Ctrl+Z                        # 暂停当前进程并放入后台

systemctl — systemd 服务管理

systemctl status nginx              # 查看服务状态
systemctl start nginx               # 启动服务
systemctl stop nginx                # 停止服务
systemctl restart nginx             # 重启服务
systemctl reload nginx              # 重载配置(不中断服务)
systemctl enable nginx              # 开机自启
systemctl disable nginx             # 禁用开机自启
systemctl list-units --type=service # 列出所有服务
systemctl daemon-reload             # 重新加载服务配置

journalctl — 查看 systemd 日志

journalctl -u nginx                    # 查看 nginx 服务日志
journalctl -u nginx --since "1 hour ago"  # 最近 1 小时日志
journalctl -f                          # 实时跟踪日志
journalctl -xe                         # 查看最近的日志(排查错误)

crontab — 定时任务

crontab -e                    # 编辑当前用户的定时任务
crontab -l                    # 查看当前用户的定时任务
crontab -r                    # 删除所有定时任务

Cron 时间格式:

* * * * * command
┬ ┬ ┬ ┬ ┬
│ │ │ │ └─ 星期 (0-7, 0和7=周日)
│ │ │ └─── 月份 (1-12)
│ │ └───── 日 (1-31)
│ └─────── 时 (0-23)
└───────── 分 (0-59)

实用示例:

# 每天凌晨 3 点备份数据库
0 3 * * * /usr/bin/mysqldump -u root mydb > /backup/mydb_$(date +\%Y\%m\%d).sql

# 每小时同步日志
0 * * * * rsync -av /var/log/app/ /backup/logs/

# 每 5 分钟检查服务状态
*/5 * * * * systemctl is-active nginx || systemctl restart nginx

三、系统信息与监控

uname — 查看系统内核信息

uname -a                     # 全部信息
uname -r                     # 内核版本
uname -m                     # 架构(x86_64 / aarch64)

df — 查看磁盘空间

df -h                        # 人性化显示所有挂载点
df -h /                      # 查看根分区
df -i                        # 查看 inode 使用情况

du — 查看目录大小

du -sh /var/log              # 目录总大小
du -sh * | sort -rh          # 按大小排序
du -h --max-depth=1 /home    # 指定深度

free — 查看内存使用

free -h                      # 人性化显示内存和 Swap
free -h -t                   # 显示总计

解读示例:

              total   used   free  shared  buff/cache  available
Mem:          15Gi   3.2Gi  2.1Gi  245Mi       9.8Gi      11Gi
Swap:         2.0Gi   0.0  2.0Gi

💡 available 才是真实的可用内存,不是 free。

lscpu — 查看 CPU 信息

lscpu                        # 显示 CPU 架构、核心数、频率等

lsblk — 查看块设备

lsblk                        # 列出磁盘和分区
lsblk -f                     # 显示文件系统和 UUID

uptime — 查看运行时间

uptime                       # 运行时间、登录用户、负载
# 输出示例:10:00:00 up 30 days, 2:00, 3 users, load average: 0.08, 0.03, 0.01

dmesg — 查看内核日志

dmesg | tail -20             # 最近的内核消息
dmesg -T                     # 显示人类可读的时间戳
dmesg | grep -i error        # 查看内核错误

lsof — 查看打开的文件

lsof                        # 列出所有打开的文件
lsof -i :80                 # 查看占用 80 端口的进程
lsof -u nginx               # 查看 nginx 用户打开的文件
lsof +D /var/log            # 查看目录下被打开的文件

四、压缩与归档

tar — 打包与压缩

# 创建
tar -czf archive.tar.gz dir/        # 打包并 gzip 压缩
tar -cjf archive.tar.bz2 dir/       # bzip2 压缩(更小更慢)
tar -cJf archive.tar.xz dir/        # xz 压缩(最小最慢)

# 解压
tar -xzf archive.tar.gz             # 解压到当前目录
tar -xzf archive.tar.gz -C /path/   # 解压到指定目录

# 查看
tar -tzf archive.tar.gz             # 查看压缩包内容

参数详解:

  • -c:创建归档
  • -x:解压
  • -z:通过 gzip 处理
  • -j:通过 bzip2 处理
  • -J:通过 xz 处理
  • -f:指定文件名
  • -v:显示处理过程
  • -t:查看内容

zip / unzip

zip -r archive.zip dir/             # 压缩目录
zip file.zip file.txt               # 压缩单个文件
unzip archive.zip                   # 解压
unzip archive.zip -d /path/         # 解压到指定目录
unzip -l archive.zip                # 查看压缩包内容

gzip / gunzip

gzip file.txt                  # 压缩为 file.txt.gz(原文件删除)
gunzip file.txt.gz             # 解压
gzip -k file.txt               # 保留原文件
gzip -d file.txt.gz            # 解压(同 gunzip)

五、综合排查实战

系统负载过高排查

# 第一步:查看整体负载
uptime

# 第二步:找出最耗 CPU 的进程
top -b -n 1 -o %CPU | head -15

# 第三步:查看具体进程详情
ps -fp PID

# 第四步:查看内存占用
free -h
ps aux --sort=-%mem | head -10

磁盘空间不足排查

# 查看分区使用
df -h

# 查找大文件
du -sh /* 2>/dev/null | sort -rh | head -20

# 查找超过 100MB 的文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# 检查日志文件
ls -lhS /var/log/*.log | head -10

# 查看已删除但仍被占用的文件(进程未释放)
lsof | grep deleted

端口占用排查

# 查看端口监听情况
ss -tlnp
netstat -tlnp

# 查看指定端口
ss -tlnp | grep :80

# 查看哪个进程占用端口
lsof -i :8080

小结: 系统管理与权限命令是运维人员的日常工具。建议重点掌握 systemctl、journalctl、ps、lsof 等排查利器,遇到问题时能快速定位。

下一篇将介绍 Linux 网络管理与软件管理相关命令。