Skip to content

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

ps – 显示进程状态

ps命令来自英文单词process的缩写,中文译为“进程”,其功能是显示当前系统的进程状态。使用ps命令可以查看到进程的所有信息,例如进程的号码、发起者、系统资源(处理器与内存)使用占比、运行状态等。ps命令可帮助我们及时发现哪些进程出现“僵死”或“不可中断”等异常情‍况。 ps命令经常会与kill命令搭配使用,以中断和删除不必要的服务进程,避免服务器的资源浪费。

语法格式

bash
ps [选项]

选项

选项说明
-A显示所有进程(同 -e)
-e显示所有进程
-a显示终端上的所有进程(除会话引导进程)
-d显示所有进程(除会话引导进程)
-f完整格式输出(显示命令行参数)
-F额外完整格式(比 -f 更多字段)
-H显示进程层次结构
-j显示作业控制信息
-l长格式输出
-L显示线程(LWP和NLWP列)
-M显示安全上下文(SELinux)
-o用户自定义格式
-y不显示标志(与 -l 一起使用)
-Z显示安全上下文(同 -M)

BSD风格选项

选项说明
aux显示所有用户的所有进程(常用组合)
-T显示该终端的所有进程
-m显示线程
-r只显示运行中的进程
-x显示无控制终端的进程

GNU长选项

选项说明
--forest树形显示进程层次
--sort指定排序字段(+field升序,-field降序)
--headers重复显示标题行
--no-headers不显示标题行
--format自定义输出格式(同 -o)
--pid显示指定PID的进程
--ppid显示指定PPID的子进程
--quick-pid快速检查指定PID

输出格式控制

bash
%cpu    	# CPU使用率
%mem    	# 内存使用率
args    	# 完整命令行
cmd     	# 简单命令名
command    	# 命令名
etime   	# 进程运行时间
euser   	# 有效用户名
fgroup  	# 文件系统组名
lstart  	# 进程启动时间
lWP			# 线程号
NLWP		# 该进程中的线程数
ni      	# nice值,优先级修改值取值范围-20到20
pcpu    	# CPU百分比(同%cpu)
pgid    	# 进程组ID
pid     	# 进程ID
ppid    	# 父进程ID
pri     	# 优先级
rss     	# 驻留集大小(内存)
stat    	# 进程状态
	S		# 休眠状态进程
	R		# 运行状态进程
	D		# 不可中断(正在等待系统分配资源)
	+		# 运行在前台进程
	Z		# 僵尸进程(需要定期清理)
time    	# 累计CPU时间
tty     	# 控制终端
	?		# 系统启动进程
	tty		# 本地登录
	pts		# 远程登录
user    	# 用户名
vsz     	# 虚拟内存大小

经典案例

bash
ps -ef      # UNIX风格
ps aux      # BSD风格
ps aux --sort=-pcpu | head -10   # 按CPU使用率降序前10
ps aux --sort=-pmem | head -10   # 按内存使用率降序前10
ps -ef --forest					# 树形显示进程关系
ps -ef | grep nginx       # 模糊匹配进程名
ps -C sshd -f             # 精确匹配命令名
ps -p 1234,5678           # 按PID筛选
ps -L -p <PID>            # 查看指定进程的线程
ps -eo pid,user,%cpu,%mem,cmd --sort=-%cpu  # 仅显示指定列
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head -n 10		# 监控高CPU进程

kill – 杀死进程

kill 命令用于向进程发送信号,以终止、暂停或恢复进程的运行。它通过进程ID(PID)识别目标进程,并支持多种信号类型,允许用户以不同方式控制进程行为。

默认信号SIGTERM (15)(请求正常终止进程)

语法格式

bash
kill [选项] <PID>...  
kill -<> <PID>...  
kill -l [信号编号]

信号选项

信号编号信号名说明常用场景
1SIGHUP挂断进程,通常用于重启或重新加载配置(如守护进程)kill -1 <PID>kill -HUP48
2SIGINT中断进程(等同于 Ctrl+C交互式程序终止
9SIGKILL强制终止,进程无法捕获或忽略,直接由内核处理顽固进程终止17
15SIGTERM默认信号,请求进程正常退出(允许清理资源)kill <PID>39
18SIGCONT恢复已暂停的进程结合 SIGSTOP 使用
19SIGSTOP暂停进程(不可捕获或忽略),等同于 Ctrl+Z调试或暂停任务

选项

选项说明
-l列出所有信号名称
-s <信号>指定信号(如 -s 9-s SIGKILL
-<信号>直接使用信号(如 -9-KILL

经典案例

bash
kill 1234              # 发送 SIGTERM (15) 请求正常终止 PID 1234
kill -9 1234           # 强制终止 PID 1234(SIGKILL):cite[1]:cite[8]
kill -1 5678           # 发送 SIGHUP,常用于重启守护进程(如 Nginx):cite[3]:cite[6]
kill -19 1234          # 暂停 PID 1234(SIGSTOP)
kill -18 1234          # 恢复 PID 1234(SIGCONT):cite[1]:cite[4]
kill 1234 5678         # 同时终止 PID 1234 和 5678:cite[3]
pkill nginx            # 终止所有名为 "nginx" 的进程
killall -9 python      # 强制终止所有 Python 进程:cite[5]:cite[8]
kill -9 $(ps -u username -o pid)  # 强制终止某用户的所有进程:cite[8]
kill -9 $(ps -A -ostat,ppid | awk '/[Zz]/ {print $2}')  # 终止僵尸进程的父进程:cite[5]:cite[6]

注意事项

  • SIGKILL-9)是最后的强制手段
    • 进程无法捕获或忽略 SIGKILL,可能导致数据丢失。
    • 优先尝试 SIGTERM-15),给进程清理资源的机会。
  • ill -15(默认) → 优雅终止(推荐优先使用)

pkill - 批量终止进程

pkillkill 的增强版,允许通过 进程名、用户、终端等条件 批量终止进程,无需手动查找 PID。

语法格式

bash
pkill [选项] <模式>

选项

选项说明
-f匹配完整命令行(而不仅是进程名)
-u按用户名匹配
-t按终端匹配(如 pts/0
-x精确匹配进程名
-n只杀最新的匹配进程
-o只杀最旧的匹配进程
-c统计匹配的进程数(不实际终止)
-l显示进程名(配合 -c 使用)

经典案例

bash
pkill -f "python"  			# 终止命令行包含 "python3" 的进程
pkill nginx         		# 终止所有名为 "nginx" 的进程 
pkill -u root       # 终止 root 用户的所有进程  
pkill -u bob,alice  # 终止多个用户的进程
pkill -t pts/1      # 终止来自终端 pts/1 的进程
pkill -9 nginx      # 强制终止(SIGKILL)  
pkill -15 python    # 优雅终止(SIGTERM,默认)  
pkill -STOP vim     # 暂停进程(SIGSTOP)  
pkill -CONT vim     # 恢复进程(SIGCONT
pkill -u bob -t pts/2		# 终止某用户的 SSH 会话

killall - 按进程名批量终止进程

killall 用于 按进程名批量终止进程(精确匹配),比 kill 更方便,但比 pkill 功能简单。

语法格式

bash
killall [选项] <进程名>

选项

选项说明
-e精确匹配进程名(默认)
-I忽略大小写
-i交互式终止(询问确认)
-r使用正则表达式匹配(类似 pkill
-s指定信号(如 -s 9-s KILL
-v显示详细信息(哪些进程被终止)
-w等待所有进程终止后再返回

经典案例

bash
killall nginx      # 终止所有名为 "nginx" 的进程
killall -9 python  # 强制终止所有 Python 进程
killall -u root    # 终止 root 用户的所有进程
killall -u bob     # 终止用户 bob 的所有进程
killall -15 nginx  # 优雅终止(SIGTERM,默认)
killall -9 vim     # 强制终止(SIGKILL)
killall -STOP bash # 暂停所有 Bash 进程 
killall -CONT bash # 恢复所有 Bash 进程

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:			# 显示支持的数据库类型​

systemd - 系统和服务管理器

systemd 是 Linux 系统的新型初始化系统和服务管理器,取代传统的 SysVinit。它提供:

  • 并行启动服务
  • 按需激活守护进程
  • 快照和系统状态恢复
  • 依赖关系管理

语法格式

bash
systemctl [OPTIONS] COMMAND [UNIT...]

主要命令

命令作用
systemctl start <服务名>启动服务(立即生效)
systemctl stop <服务名>停止服务
systemctl restart <服务名>重启服务
systemctl reload <服务名>重新加载配置(不重启服务)
systemctl status <服务名>查看服务状态(运行/失败/日志)
systemctl enable <服务名>开机自启
systemctl disable <服务名>开机不自启
systemctl is-active <服务名>检查服务是否正在运行
systemctl is-enabled <服务名>检查服务是否开机自启
systemctl enable --now <服务名>开机自启,并立即启动
systemctl disable --now <服务名>开机不自启,并立即关
systemctl status系统管理
journalctl -u <服务名>日志管理
journalctl查看系统日志

经典案例

bash
systemctl status nginx				# 查看服务状态
systemctl enable docker				# 设置开机启动
systemctl enable docker	--now		# 设置开机启动并立即启动
systemctl start sshd				# 启动服务
systemctl stop apache2				# 停止服务
systemctl restart mysql				# 重启服务

注意事项

  1. 配置文件路径:
    • 系统服务:/etc/systemd/system/
    • 用户服务:~/.config/systemd/user/
  2. 修改配置后需要重载:systemctl daemon-reload
  3. 查看日志journalctl -u service_name
  4. 不同发行版差异:
    • Ubuntu 16.04+ 默认使用
    • CentOS 7+ 默认使用
    • 旧版系统可能需要手动安装

journalctl - 查询 systemd 日志

journalctl 是 systemd 提供的日志管理工具,用于查看和分析系统日志。它替代了传统的 syslog,并提供了更强大的日志过滤、搜索和格式化功能。

语法格式

bash
journalctl [OPTIONS] [MATCHES...]

选项

选项说明
-u UNIT查看指定服务的日志
-b查看本次启动的日志
-f实时跟踪日志(类似 tail -f
-n NUM显示最近的 NUM 条日志
-k仅显示内核日志
--since "YYYY-MM-DD HH:MM:SS"查看指定时间之后的日志
--until "YYYY-MM-DD HH:MM:SS"查看指定时间之前的日志
-p PRIORITY按日志级别过滤(如 emerg, alert, crit, err, warning, notice, info, debug
-o json以 JSON 格式输出日志
--no-pager直接输出(不进入分页模式)

经典案例

bash
journalctl						# 查看所有日志
journalctl -u nginx				# 查看特定服务的日志
journalctl -f					# 实时跟踪日志(类似 tail -f)
journalctl -n 50				# 查看最近 50 条日志
journalctl -b					# 查看本次启动的日志
journalctl -p err				# 查看错误级别的日志
journalctl --since "2023-10-01 00:00:00" --until "2023-10-02 23:59:59"		# 查看特定时间段的日志
journalctl -k					# 查看内核日志
journalctl _PID=1234			# 查看某个进程的日志
journalctl -u sshd --no-pager > sshd.log		#导出日志到文件​

注意事项

  1. 权限要求

    • 普通用户只能查看自己的日志。

    • 使用sudo

      查看系统日志:

      bash
      sudo journalctl
  2. 日志存储位置

    • 默认存储在 /var/log/journal/(如果存在)。
    • 如果未启用持久化存储,重启后日志会丢失。
  3. 启用持久化存储

    bash
    sudo mkdir -p /var/log/journal
    sudo systemd-tmpfiles --create --prefix /var/log/journal
    sudo systemctl restart systemd-journald
  4. 日志大小限制

    • 默认限制在/etc/systemd/journald.conf中配置:

      ini
      SystemMaxUse=500M
      RuntimeMaxUse=100M

top - 实时进程监控工具

top 是 Linux 系统中最常用的实时进程监控工具,可以动态查看系统资源使用情况、进程状态和系统负载。

语法格式

bash
top [选项]
  • 默认显示 CPU、内存、进程等信息
  • q 退出
选项说明
top -d <秒>设置刷新间隔(默认 3 秒)
top -p <PID>仅监控指定进程
top -u <用户名>仅显示指定用户的进程
top -H显示线程(而不是进程)
top -b批处理模式(适合输出到文件)
top -n <次数>运行指定次数后退出

top 交互命令

top 运行时,可以输入以下命令进行交互:

全局控制

命令说明
q退出 top
h显示帮助
Space立即刷新
z切换彩色/黑白显示
W保存当前配置到 ~/.toprc

排序控制

命令说明
P (大写)CPU 使用率 排序
M (大写)内存使用率 排序
T (大写)运行时间 排序
N (大写)PID 排序
R (大写)反向排序

进程操作

命令说明
k杀死进程(输入 PID 后回车)
r调整进程的 nice 值(优先级)
c显示完整命令行
H (大写)显示/隐藏线程

top 界面解析

top 界面分为 顶部汇总信息进程列表 两部分:

顶部汇总信息

bash
top - 10:30:45 up 2 days,  3:45,  2 users,  load average: 0.15, 0.10, 0.05
Tasks: 120 total,   2 running, 118 sleeping,   0 stopped,   0 zombie
%Cpu(s):  5.3 us,  1.2 sy,  0.0 ni, 93.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7856.4 total,   1024.2 free,   4096.0 used,   2736.2 buff/cache
MiB Swap:   2048.0 total,   2048.0 free,      0.0 used.   3200.0 avail Mem
  • 第1行:系统运行时间、用户数、平均负载(1/5/15 分钟)
  • 第2行:进程状态(运行、睡眠、停止、僵尸)
  • 第3行:CPU 使用情况(用户态、内核态、空闲、IO等待等)
  • 第4行:物理内存使用情况(总量、空闲、已用、缓存)
  • 第5行:交换分区(Swap)使用情况

进程列表

bash
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 1234 root      20   0  500000  80000  10000 R  10.5  1.0   5:30.01 firefox
 5678 mysql     20   0 2000000 500000  20000 S   5.2  6.3  10:20.45 mysqld
  • PID:进程 ID
  • USER:进程所属用户
  • PR:优先级
  • NInice 值(-20 最高,19 最低)
  • VIRT:虚拟内存使用量(KB)
  • RES:物理内存使用量(KB)
  • SHR:共享内存(KB)
  • S:进程状态(R=运行, S=睡眠, Z=僵尸, D=不可中断)
  • %CPU:CPU 占用率
  • %MEM:内存占用率
  • TIME+:累计 CPU 时间
  • COMMAND:进程名(c 键可切换完整命令)

经典案例

bash
top -p 1234,5678  			# 监控 PID 1234 和 5678
top -b -n 3 > top.log  		# 运行 3 次并保存到文件
top -H -p 1234  			# 查看 PID 1234 的所有线程
top -o %MEM  				# 按内存占用排序
top -d 1  					# 每秒刷新一次

pstree - 树状结构显示进程

pstree 命令以树状结构显示系统中正在运行的进程及其关系,直观展示进程间的父子关系。

语法格式

bash
pstree [选项] [PID/用户名]

主要选项

选项说明
-a显示完整命令行
-c禁止压缩相同进程
-h高亮当前进程及其祖先
-H PID高亮指定PID的进程
-l显示长行(不截断)
-n按PID排序(默认按名称)
-p显示PID
-u显示用户切换
-G使用VT100线条字符
-U使用UTF-8线条字符

经典案例

bash
pstree -p				# 显示完整进程树(带PID)
pstree username			# 显示特定用户的进程
pstree -H `pgrep sshd`	# 高亮显示SSH进程
pstree -a				# 显示完整命令行(适合调试)

nohup - 后台运行进程

nohup (no hang up) 命令用于在用户注销(logout)或终端关闭后仍保持进程运行,默认将输出重定向到nohup.out文件。

语法格式

bash
nohup 命令 [参数] &

关键特性

  1. 忽略SIGHUP信号:终端关闭时不会终止进程
  2. 自动重定向输出
    • STDOUT 和 STDERR 默认写入nohup.out
    • 如果不可写则保存到$HOME/nohup.out

经典案例

bash
nohup ./script.sh &								# 基础用法(后台运行)
nohup python app.py > custom.log 2>&1 &			# 自定义输出文件
nohup command > /dev/null 2>&1 &				# 完全丢弃输出
nohup java -jar app.jar --server.port=8080 &	# 启动Web服务

注意事项

  1. 文件权限问题

    • 确保对输出文件有写入权限
    • 推荐明确指定输出路径
  2. 进程管理

    bash
    jobs -l       # 查看后台任务
    kill %1       # 终止任务
  3. 日志轮转: 长期运行建议使用logrotate管理输出文件

  4. 替代方案: 现代系统推荐使用更专业的工具:

    bash
    systemd-run --user --unit=myapp ./app.sh  # systemd方式
    tmux new -d -s session 'command'          # tmux方式

jobs - 查看后台进程

jobs 是 Bash 内置命令,用于查看当前 shell 会话中所有后台运行的作业(任务)状态。它常与 fgbg&Ctrl+Z 等配合使用进行作业控制。

语法格式

bash
jobs [-lnprs] [jobspec ...]

选项

选项说明
-l显示 PID 和作业详细信息
-n仅显示状态改变的作业
-p仅显示作业的进程组 ID
-r仅显示运行中的作业
-s仅显示暂停的作业

输出符号说明

符号含义
+默认恢复的作业(fg/bg 不指定时操作此作业)
-下一个将被默认恢复的作业
Running正在后台运行
Stopped被暂停(如用 Ctrl+Z
Done已完成

经典案例

bash
jobs -l					# 查看所有后台作业
jobs -r  # 只看运行中的作业
jobs -s  # 只看暂停的作业



# 配合任务控制
sleep 100 &				# 启动后台作业
# 按 Ctrl+Z暂停当前前台作业
jobs					# 查看状态
bg %2					# 恢复作业到后台运行
fg %1					# 恢复作业到前台

bg - 暂停的作业(Job)恢复至后台运行

bg(Background)是 Bash 内置命令,用于将 暂停的作业(Job)恢复至后台运行。通常配合 Ctrl+Z(暂停进程)和 fg(恢复至前台)使用。

语法格式

bash
bg [作业编号]

选项

bg 本身没有选项,但依赖 作业控制符号

符号说明
%n作业编号(如 %1%2
%strstr 开头的作业名(如 %vim
%?str包含 str 的作业名(如 %?py 匹配 python
%%%+当前作业(最近暂停的)
%-上一个作业

经典案例

bash
bg %1      # 恢复作业 1 到后台运行  
bg         # 恢复最近暂停的作业(带 `+` 标记的)  

# 结合 jobs 查看作业状态
jobs -l      # 查看所有作业(含 PID 和状态)  
bg %2        # 恢复作业 2 到后台  

# 配合 Ctrl+Z 使用
vim file.txt  # 启动一个前台进程  
# 按 Ctrl+Z 暂停  
bg            # 恢复 vim 到后台运行

# 结合 nohup 保持后台运行
python server.py  
# 按 Ctrl+Z 暂停  
bg                # 恢复至后台  
disown -h %1      # 脱离终端关联(避免关闭终端时被终止)

注意事项

  1. 仅适用于当前 Shell

    • bg 只能管理当前终端启动的作业,新终端无法控制。
  2. 输出可能丢失

    • 后台运行的进程如果未重定向输出(如 > log.txt),可能丢失打印信息。
  3. & 的区别

    方式特点
    command &直接后台运行
    Ctrl+Z + bg先暂停,再后台恢复
  4. 无法恢复已终止的作业

    • 如果作业已被 kill 终止,bg 无法恢复。

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. 日志记录:建议在破解过程中记录日志,以便后续分析和审计。

cut - 文本切割工具

简介

cut 是 Linux 中用于按列或字符位置切割文本行的实用工具,常用于处理结构化文本数据(如 CSV、日志文件等)。它支持三种切割模式:按字节、字符或字段(列)进行提取。

语法格式

bash
cut OPTION... [FILE]...

选项

选项描述示例
-b BYTE_LIST按字节位置切割cut -b 1-5 file.txt
-c CHAR_LIST按字符位置切割cut -c 2,4,6 file.txt
-f FIELD_LIST按字段(列)切割cut -f 1,3 -d',' data.csv
-d DELIMITER指定字段分隔符(默认 TAB)cut -d':' -f1 /etc/passwd
--complement反选(显示未选中的部分)cut -f3 --complement data.txt
-s不输出不含分隔符的行cut -s -d':' -f1 file.log

经典案例

bash
# 提取/etc/passwd的用户名(第一字段)
cut -d':' -f1 /etc/passwd

# 提取日志的时间戳(前15个字符)
cut -c 1-15 /var/log/syslog

# 提取CSV文件的第2和第4列
cut -d',' -f2,4 data.csv

# 结合管道处理ps输出
ps aux | cut -c 1-100 | head -n 5

注意事项

  1. 字段编号从1开始计数
  2. 当使用 -f 时建议总是显式指定 -d 参数
  3. 中文字符建议使用 -c 而非 -b(避免截断多字节字符)
  4. 空分隔符字段需要用 -s 避免显示
  5. 范围表示法:
    • N 第N个单元
    • N- 从第N个到行尾
    • N-M 从第N到第M个
    • -M 从行首到第M个

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. 磁盘压力测试会创建大文件(默认在临时目录),测试完成后会自动删除