Skip to content

系统管理

系统管理是Linux运维工作的核心部分,涉及对系统资源、服务、配置和安全的全面管理。本章介绍的命令工具能够帮助管理员监控系统状态、管理服务、配置网络、维护文件系统以及执行其他关键的系统管理任务。

通过掌握这些命令,您将能够高效地进行系统监控、故障排查、性能优化和日常维护工作,确保Linux系统的稳定运行和安全性。

uname – 显示系统内核信息

uname命令来自英文词组UNIX name的缩写,其功能是查看系统主机名、内核及硬件架构等信息。如果不加任何参数,默认仅显示系统内核名称(相当于-s参数)的作用。

语法格式

bash
uname [选项]

选项

参数输出内容典型值示例技术细节
-s内核名称Linux对应struct utsname.sysname
-n网络节点主机名server01来自gethostname()系统调用
-r内核发行版本5.15.0-78-generic包含ABI兼容性标识
-v内核构建信息#85-Ubuntu SMP ...包含编译日期和GCC版本
-m硬件架构x86_64/aarch64对应CPU指令集架构
-p处理器类型Intel(R) Xeon(R) Gold可能返回unknown(需root)
-o操作系统名称GNU/LinuxGNU扩展参数
-a所有可用信息综合上述所有参数输出输出顺序:s n r v m p o

which - 查找命令所在的位置

定位给定命令的可执行文件路径,通过搜索 $PATH 环境变量中的目录顺序查找第一个匹配项

语法格式

bash
which [选项] 命令名...

选项

选项作用示例
-a显示所有匹配路径(不限于第一个)which -a python
--skip-alias忽略别名扩展which --skip-alias ll
--skip-functions跳过shell函数which --skip-functions _git
--read-alias从stdin读取别名(需配合alias命令)`alias
-i交互模式(部分实现支持)which -i docker
  • 进程无法捕获或忽略 SIGKILL,可能导致数据丢失。
  • 优先尝试 SIGTERM-15),给进程清理资源的机会。
  • ill -15(默认) → 优雅终止(推荐优先使用)

type - 查看是外部命令还是内部命令

type 是 Linux 中用于显示命令类型的实用工具,它能够告诉你指定的命令是别名、shell 内置命令、函数还是外部可执行文件。

语法格式

bash
type [选项] 命令名

选项

选项说明
-t只显示命令类型(简短输出)
-p如果是外部命令,显示其路径
-P强制在 PATH 中查找,即使命令是别名或函数
-a显示所有可能的定义(包括别名、内置命令、外部命令等)

经典案例

  1. 基本用法

    bash
    type ls			# 查看命令类型
    type -t cd		# 只显示命令类型(简洁模式
    type -p python	# 查找外部命令的路径
    type -a echo	# 显示命令的所有可能定义
  2. 实用技巧

    bash
    # 区分命令是内置还是外部
    if [ "$(type -t command)" = "builtin" ]; then
        echo "This is a shell builtin"
    fi
    # 获取可执行文件的完整路径
    full_path=$(type -p some_command)

hostnamectl – 显示与设置主机名称

hostnamectlsystemd 提供的工具,用于查询和修改 Linux 系统的主机名及相关系统信息。它直接与 systemd-hostnamed 服务交互,无需手动编辑配置文件(如 /etc/hostname/etc/hosts)。

语法格式

bash
hostnamectl [选项] [命令] [主机名]

选项

选项说明
--static设置静态主机名(默认,持久化)
--transient设置临时主机名(重启失效)
--pretty设置美观主机名(可含空格/符号)
--no-ask-password执行时不提示输入密码(脚本适用)
-h--help显示帮助信息

经典案例

bash
hostnamectl													# 查看当前主机信息
hostnamectl set-hostname "new-server" --static				# 修改静态主机名(永久生效)

NOTE

设置后可以使用bash命令使其立即生效

rpm - 软件包管理工具

RPM(Red Hat Package Manager)是 Red Hat 系列 Linux 发行版(如 RHEL、CentOS、Fedora)的软件包管理工具,用于安装、查询、验证、升级和卸载软件包。

语法格式

bash
rpm [选项] [软件包名/文件]

常用选项分类

安装/升级/卸载选项

选项说明
-i安装软件包
-U升级软件包(如不存在则安装)
-F升级已安装的软件包
-e 软件名卸载软件包
--nodeps忽略依赖关系,强制卸载程序
--force强制操作。和ivh 配合使用,覆盖系统内的旧的安装信息

查询选项

选项说明
-q查询软件包
-a查询所有已安装的软件包
-l 软件名列出软件包中的文件
-i 软件名显示软件包信息
-f 软件名查询文件属于哪个软件包
-c列出配置文件

验证选项

选项说明
-V验证软件包文件
--checksig验证软件包签名

经典案例

bash
# -v 显示详细信息
# -h 显示进度条
rpm -ivh package.rpm
rpm -e package-name			# 卸载软件包
rpm -qa						# 查询所有已安装的软件包
rpm -q package-name			# 查询特定软件包是否安装
rpm -ql package-name		# 列出软件包包含的文件
rpm -qf /usr/bin/rz			# 查询文件属于哪个软件包

注意事项

  1. 依赖问题:RPM 不会自动解决依赖关系(建议使用 yum/dnf)
  2. 安装顺序:多个相互依赖的软件包需按正确顺序安装
  3. 强制安装--force 可能破坏系统稳定性
  4. 签名验证:建议始终验证软件包签名
  5. 配置文件:升级时旧配置文件会保存为 .rpmsave 文件

yum/dnf软件包管理

yum(Yellowdog Updater Modified)是 RHEL/CentOS 等基于 RPM 的 Linux 发行版的 高级包管理工具,相比 rpm自动解决依赖关系,简化软件安装和管理。

语法格式

bash
yum [选项] [命令] [软件包名/组名/通配符]

常用命令

操作类型命令功能说明
安装install安装指定软件包
groupinstall安装软件包组
卸载remove卸载软件包(保留依赖)
autoremove卸载未使用的依赖
更新update更新所有/指定软件包
upgrade升级整个系统(CentOS 8+用dnf
查询list列出可用/已安装的包
search搜索软件包
info显示软件包详细信息
provides查询命令所属安装包
仓库repolist列出已启用的仓库
clean all清理缓存(/var/cache/yum
历史history查看操作历史
history undo <ID>撤销指定操作

选项

选项作用
-y自动回答 "yes"(非交互式)
-q静默模式(不显示输出)
-v显示详细过程
--nogpg跳过 GPG 签名验证

经典示例

yum

bash
yum clean all							# 清理缓存(释放磁盘空间)
yum makecache							# 生成缓存
yum install -y nginx					# 安装软件包
yum remove httpd						# 卸载软件包(保留依赖)
yum update -y							# 更新所有软件包
yum search python3						# 搜索软件包
yum info nginx							# 查看软件包信息

## 回滚操作
yum history list						# 查看yum操作历史
yum history undo 3  					# 撤销ID为3的操作
yum localinstall /path/to/package.rpm	# 本地安装 RPM

常见问题

  1. 报错 "No match for argument" ⇒ 检查包名是否正确或更新仓库:sudo yum makecache

  2. 仓库元数据损坏 ⇒ 清理缓存后重建:

    bash
    sudo yum clean all
    sudo yum makecache
  3. 替代 yumdnf CentOS 8+/RHEL 8+ 中,yumdnf 的符号链接,用法基本一致。

alias - 命令别名

在 Shell 会话中创建命令快捷方式,通过字符串替换实现命令简化或增强

语法格式

bash
alias [别名]='原始命令'

操作维度

操作类型命令示例作用说明
创建别名alias ll='ls -alh'ls -alh绑定到ll
查看别名aliasalias ll显示所有/指定别名定义
删除别名unalias ll移除指定别名
持久化存储写入~/.bashrc~/.zshrc实现登录时自动加载

clear - 清除屏幕

clear命令来自英文单词,中文译为“清理”,其功能是用于清除终端界面已有内容。执行clear命令后终端界面会向后翻一页,实现了“清除”当前屏幕上已有内容的效果,等同于快捷键“Ctrl+c”的效果

语法格式

bash
clear [参数]

选项

选型说明
--help显示帮助信息
--vesion显示版本信息

xargs - 列数据转换为命令行参数

xargs(eXtended ARGuments)用于将标准输入(stdin)的数据转换为命令行参数,并传递给其他命令执行。它解决了管道符 | 无法直接将输入作为参数的问题,常用于批量处理文件、多参数传递等场景。

格式

bash
[输入源] | xargs [选项] [目标命令] [目标命令的选项]
  • 输入源:通常来自管道(如 findgrep 的输出)或文件。

  • 目标命令:默认是 echo(仅显示参数),通常替换为 rmmvcp 等需要参数的命令。

参数

参数说明
-n NUM每次执行命令时传递 NUM 个参数
-I {}定义替换字符串(如 {}),将输入插入到命令的指定位置
-p交互式模式,执行前询问用户确认
-t打印要执行的命令(调试用)
-0 / --null输入项以 \0 分隔(配合 find -print0 处理含空格/特殊字符的文件名)
-P NUM并行执行,启动 NUM 个进程加速任务
-d DELIM自定义分隔符(默认以空格/Tab/换行分隔输入)
-s MAX_SIZE设置命令行的最大总长度(避免 "Argument list too long" 错误)

应用场景

bash
# 删除所有 .tmp 文件(先确认列表,再替换为 rm)
find . -name "*.tmp" | xargs rm -f
# 将找到的 .log 文件移动到 backup 目录
find /var/log -name "*.log" | xargs -I {} mv {} ~/backup
find /var/log -name "*.log" | xargs -I @ mv @ ~/backup
find /var/log -name "*.log" | xargs -i -i mv {} ~/backup
# 使用 find -print0 和 xargs -0 安全处理文件名
find . -name "*.txt" -print0 | xargs -0 -I {} cp {} ~/docs
# 每次传递 3 个文件给 tar 命令压缩
find . -type f -name "*.csv" | xargs -n 3 tar -czvf archive.tar.gz
# 使用 4 个进程并行压缩图片
find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% {}_resized.jpg
# 删除文件前询问用户确认
find . -name "*.bak" | xargs -p rm -f
# 批量重命名文件(比 for 循环更高效)
ls *.txt | xargs -I {} mv {} {}_backup
# 将输入作为中间参数传递
echo "keyword" | xargs -I {} grep {} file1.txt file2.tx
# 批量替换文件后缀
find . -name "*.cfg" | xargs -I {} bash -c 'mv "$0" "${0%.cfg}.md"' {} \;

seq - 生成数字序列

生成指定范围内的整数序列,常用于循环操作或生成测试数据。

语法格式

bash
seq [选项] 起始值 步长 结束值
# 简化形式:
seq 结束值           # 生成 1 到 N 的序列
seq 起始值 结束值    # 生成 起始值 到 结束值 的序列
seq 起始值 步长 结束值

选项

选项作用示例
-s指定分隔符(默认换行)seq -s " " 31 2 3
-w等宽补零(对齐数字位数)seq -w 8 1008 09 10
-f格式化输出(类似 printf)seq -f "num%03g" 3num001 num002 num003

make - 构建工具

GNU make 是自动化构建工具,通过读取 Makefile 文件自动执行编译、安装等任务。广泛用于 C/C++ 项目,但支持任意文件依赖关系的自动化处理。

语法格式

bash
make [选项] [目标] [宏定义]

选项

选项作用
-f FILE指定非默认名称的 Makefile
-j N并行执行任务(N=线程数)
-n只显示命令但不执行(dry-run)
-B强制重建所有目标
-C DIR先切换到指定目录再执行
install执行安装目标
clean执行清理规则
--debug输出调试信息

经典案例

bash
make            	# 编译默认目标(通常是第一个目标)
make -j4        	# 使用4个线程并行编译
make -f build.mk	# 指定自定义 Makefile
make CC=clang   	# 临时使用clang代替默认编译器
make install    	# 执行安装目标
make clean      	# 执行清理规则

调试技巧

bash
make --debug=v    # 详细输出依赖检查过程
make -p           # 打印所有内置规则和变量

NOTE

💡 扩展知识:现代替代品如 CMake/Meson 会生成 Makefile,但 make 仍是实际执行构建的标准工具。

getent - 统一查询系统数据库

getent 是 Linux 系统中用于统一查询系统数据库的命令

语法格式

bash
getent 数据库类型 [查询键]

基本功能

数据库类型描述
passwd用户账户信息(替代 /etc/passwd
group组信息(替代 /etc/group
hosts主机名解析(替代 /etc/hosts
services网络服务列表
shadow密码哈希(需 root 权限)

经典案例

bash
getent passwd							# 批量查询所有用户等效于 cat /etc/passwd
getent passwd username					# 查询用户信息
getent group groupname					# 查询组信息
getent hosts www.openeuler.org			# 主机名解析
getent services ssh						# 查询网络服务​
getent --help | grep databases:			# 显示支持的数据库类型​

at - 在指定时间执行一次性任务

at 命令用于在指定时间执行一次性任务,适合安排未来某个时刻运行的作业。任务执行后会从队列中自动删除。

语法格式

bash
at [-V] [-q queue] [-f file] [-mldbv] TIME
at -c job [job...]
atq [-V] [-q queue]
atrm [-V] job [job...]

选项

选项描述示例
-f file从指定文件读取命令at -f script.sh 13:00
-m任务完成后发送邮件at -m now + 1 hour
-l列出待处理任务(同atq)at -l
-d job删除指定任务(同atrm)at -d 3
-v显示任务执行时间at -v tomorrow
-q queue指定队列(a-z,A-Z)at -q b 15:00
TIME时间格式:HH:MM、noon、midnight等at 23:59

经典案例

bash
# 明天上午10点执行备份脚本
at 10:00 tomorrow -f /backup/script.sh

# 5分钟后执行命令
echo "shutdown -h now" | at now + 5 minutes

# 查看当前任务队列
atq
1       Fri Aug 20 10:00:00 2023 a user

# 删除编号为2的任务
atrm 2

注意事项

  1. 需要atd服务运行(systemctl start atd
  2. 默认输出会通过邮件发送,建议使用-m选项或重定向输出
  3. 时间格式支持灵活写法:
    • 绝对时间:10:00、23:59
    • 相对时间:now + 2 hours
    • 特殊时间:noon、teatime(16:00)、tomorrow
  4. 不同发行版可能需要单独安装at包
  5. 系统重启后未执行的任务会丢失

crontab - 周期性任务调度守护进程

crontab 是 Linux 系统中用于周期性执行任务的守护进程,通过读取 /etc/crontab 和用户 crontab 文件来调度任务。相比 at 命令,crontab 更适合需要重复执行的任务。

语法格式

bash
crontab [-u user] [-l | -r | -e] [file]

选项

选项描述示例
-u user指定用户crontabcrontab -u alice -l
-l列出当前crontab内容crontab -l
-r清空指定用户crontab,默认rootcrontab -r
-e编辑当前crontabcrontab -e
-f file从文件安装crontabcrontab ~/mycron
-n前台运行模式crond -n
-s启用SELinux安全上下文crond -s

时间格式说明

bash
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
# 分 时 日  月 周 用户 command
  • 分钟(0 - 59)
  • 小时(0 - 23)
  • 日期(1 - 31)
  • 月份(1 - 12)
  • 星期(0 - 7,0 和 7 都代表周日)
  • user-name执行用户,默认root
  • command是要执行的命令或脚本

时间表达式

  • *:表示任意值,例如*在分钟字段就意味着每分钟。
  • ,:用于分隔多个值,像1,3,5就表示 1、3、5 这几个值。
  • -:用于指定范围,例如1-5代表从 1 到 5 的范围。
  • /:用于指定间隔,例如*/2表示每 2 个单位执行一次。

经典案例

bash
# 每天凌晨3点执行备份脚本
0 3 * * * /usr/local/bin/backup.sh

# 每5分钟检查一次服务状态
*/5 * * * * /usr/bin/systemctl check-service

# 每周一上午9点发送周报
0 9 * * 1 /usr/bin/send-weekly-report

# 每月1号中午12点清理日志
0 12 1 * * /usr/bin/logrotate -f /etc/logrotate.conf

# 每天0点备份代码
0 0 * * * /usr/bin/tar zcf /data/www-$(/usr/bin/date +%F).tar.gz /data/wwwroot/www

# 查看当前用户的crontab
crontab -l

# 编辑crontab(使用默认编辑器)
crontab -e

注意事项

  1. 服务必须保持运行:systemctl enable --now crond
  2. 环境变量与登录shell不同,建议脚本中使用绝对路径
  3. 特殊符号说明:
    • * 表示所有有效值
    • , 表示多个时间点(1,3,5)
    • - 表示范围(1-5)
    • / 表示间隔(*/10)
  4. 系统级crontab位于:
    • /etc/crontab
    • /etc/cron.d/
    • /etc/cron.hourly/等目录
  5. 日志查看:grep CRON /var/log/syslogjournalctl -u crond

john - 密码破解工具

john 是一个强大的密码破解工具,支持多种加密算法和哈希类型。它常用于安全审计和密码强度测试。

语法格式

bash
john [选项] [文件]

选项

选项描述示例
-w:FILE使用指定的单词列表文件john -w:wordlist.txt hashfile
-rules启用规则攻击john -rules hashfile
-single使用单模式破解john -single hashfile
-incremental使用增量模式破解john -incremental hashfile
--show显示已破解的密码john --show hashfile
-format:NAME指定哈希格式john -format:md5crypt hashfile
-users:[-]LOGINUID[,..]只针对特定用户john -users:0 hashfile
-groups:[-]GID[,..]只针对特定组john -groups:0 hashfile
-salts:[-]COUNT只针对特定数量的盐值john -salts:2 hashfile

经典案例

bash
# 使用单词列表破解哈希文件
john -w:wordlist.txt shadow

# 使用规则攻击破解哈希文件
john -rules shadow

# 显示已破解的密码
john --show shadow

# 使用增量模式破解哈希文件
john -incremental shadow

# 只针对特定用户破解哈希文件
john -users:root shadow

注意事项

  1. 合法性:使用 john 进行密码破解时,请确保你有合法权限。未经授权的密码破解是违法行为。
  2. 性能:密码破解是一个资源密集型任务,建议在性能较好的机器上运行,或者使用分布式破解工具如 John the Ripper 的分布式版本。
  3. 哈希格式:确保指定正确的哈希格式,否则 john 可能无法正确识别和破解哈希。
  4. 单词列表:选择一个高质量的单词列表可以显著提高破解成功率。常用的单词列表包括 rockyou.txt 等。
  5. 日志记录:建议在破解过程中记录日志,以便后续分析和审计。

sh - Bourne Shell 命令解释器

简介

sh 是 Unix/Linux 系统中最基础的 shell 解释器,全称为 Bourne Shell。作为系统默认的命令行解释器,它负责解析用户输入的命令并与操作系统内核交互。现代系统中通常将 sh 符号链接到兼容性更好的 shell(如 bash 或 dash)。

语法格式

bash
sh [选项] [脚本文件] [参数]

选项

选项描述示例
-c 命令执行指定字符串命令sh -c "ls -l"
-n检查脚本语法不执行sh -n test.sh
-x显示执行的命令及参数sh -x script.sh
-e命令失败立即退出sh -e backup.sh
-v显示输入的命令行sh -v install.sh
-u使用未定义变量时报错sh -u config.sh

经典案例

bash
# 1. 执行单行命令
sh -c "date +%F"

# 2. 调试脚本执行
sh -x /etc/init.d/nginx start

# 3. 带参数执行脚本
sh backup.sh /data /backup

# 4. 检查脚本语法
sh -n deploy.sh && echo "语法检查通过"

# 5. 安全模式运行
sh -eu cleanup.sh

注意事项

  1. 现代系统中 /bin/sh 通常是符号链接,实际可能是 bashdash 等兼容 shell
  2. 使用 -e 选项可避免错误继续执行,适合关键任务脚本
  3. -x 调试输出会显示变量展开后的实际值
  4. 不同系统的 sh 实现可能有细微差异,重要脚本应指定完整路径
  5. 避免使用未定义的变量,建议配合 -u 选项使用

stress - 系统压力测试工具

简介

stress 是一个用于对 Linux 系统施加 CPU、内存、IO 和磁盘压力的工具,常用于系统稳定性测试和性能评估。它可以模拟高负载场景,帮助管理员测试系统在压力下的表现。

语法格式

bash
stress [OPTIONS]

选项

选项描述示例
-c N启动 N 个 CPU 压力进程stress -c 4
-i N启动 N 个 IO 压力进程stress -i 2
-m N启动 N 个内存压力进程stress -m 1
-d N启动 N 个磁盘压力进程stress -d 1
-t TIMEOUT设置测试持续时间(秒)stress -c 2 -t 60
--vm-bytes SIZE指定每个内存压力进程使用的内存量(默认 256MB)stress -m 1 --vm-bytes 512M
--hdd-bytes SIZE指定每个磁盘压力进程写入的数据量stress -d 1 --hdd-bytes 1G

经典案例

bash
# 启动4个CPU压力进程,持续30秒
stress -c 4 -t 30

# 同时施加CPU和内存压力(2个CPU进程+1个内存进程使用1GB内存)
stress -c 2 -m 1 --vm-bytes 1G -t 120

# 综合压力测试(CPU+内存+磁盘)
stress -c 2 -i 1 -m 1 -d 1 --hdd-bytes 500M -t 300

注意事项

  1. 需要 root 权限才能施加磁盘和内存压力
  2. 过度使用可能导致系统不稳定,建议在测试环境中使用
  3. 监控系统资源使用情况(建议配合 tophtop 使用)
  4. 默认情况下,内存压力进程会不断分配和释放内存
  5. 磁盘压力测试会创建大文件(默认在临时目录),测试完成后会自动删除

free - 显示内存使用情况

free 命令用于显示系统的物理内存和交换空间使用情况,包括总内存、已用内存、空闲内存等信息。

语法格式

bash
free [选项]

选项

选项描述示例
-b以字节为单位显示内存使用情况free -b
-k以 KB 为单位显示(默认)free -k
-m以 MB 为单位显示free -m
-g以 GB 为单位显示free -g
-h以人类可读的格式显示(自动选择单位)free -h
-s 秒数每隔指定秒数刷新显示free -s 5
-c 次数-s 配合使用,指定刷新次数free -s 2 -c 10
-t显示总计行(物理内存 + swap)free -t
--help显示帮助信息free --help
--version显示版本信息free --version

输出字段说明

              total        used        free      shared  buff/cache   available
Mem:        8169348     2345232     3412345      123456     2411771     5123456
Swap:       2097148           0     2097148
  • total: 总内存量
  • used: 已使用内存(包括buffers/cache)
  • free: 完全空闲内存
  • shared: 共享内存
  • buff/cache: 缓存和缓冲区使用的内存
  • available: 估计可用于启动新应用的内存

使用示例

bash
# 以人类可读的格式显示内存使用情况
free -h

# 每隔 3 秒刷新一次,共刷新 5 次
free -s 3 -c 5

# 显示总计行(物理内存 + swap)
free -t

# 以 MB 为单位显示内存使用情况
free -m

注意事项

  1. Linux会尽可能利用空闲内存做缓存,因此看到"free"很少是正常现象
  2. 关注"available"字段更准确反映可用内存
  3. 交换空间(swap)使用过多可能表明物理内存不足
  4. 在嵌入式系统或容器环境中,某些字段可能显示为0