Linux笔记

0 阅读17分钟

Linux服务器运维常用指令速查表

一、文件与目录操作

命令说明常用示例
ls列出目录内容ls -l (详细列表), ls -a (显示隐藏文件), ls -lh (人性化显示大小)
cd切换目录cd ~ (回到家目录), cd .. (返回上级目录), cd - (回到上一次目录)
pwd显示当前工作目录路径pwd
mkdir创建目录mkdir -p dir1/dir2 (递归创建多级目录), mkdir -m 700 secret (创建带权限目录)
rmdir删除空目录rmdir empty_dir
rm删除文件/目录rm -rf dir (强制递归删除), rm -f file (强制删除文件)
cp复制文件/目录cp -r dir1 dir2 (递归复制目录), cp -i file1 file2 (交互式复制)
mv移动/重命名文件/目录mv old.txt new.txt (重命名), mv file /tmp/ (移动文件)
touch创建空文件或更新文件时间戳touch newfile.txt
find在目录树中查找文件find /home -name "*.log", find . -type f -mtime -7 (查找7天内修改的文件)
locate快速定位文件(需先执行updatedb)locate passwd

二、文件内容查看与处理

命令说明常用示例
cat显示文件内容cat file.txt, cat -n file.txt (显示行号)
less分页查看文件内容(推荐)less longfile.log (按空格翻页,q退出)
more分页显示文件内容more output.txt
head显示文件开头部分head -n 20 file.log (显示前20行)
tail显示文件结尾部分tail -f logfile.log (实时跟踪日志), tail -n 50 file.log (显示最后50行)
grep文本搜索grep "error" logfile.log, grep -r "pattern" /dir (递归搜索)
wc统计文件内容wc -l file.txt (统计行数)
diff比较两个文件差异diff file1.txt file2.txt
sort对文件行排序sort file.txt, sort -u file.txt (去重排序)

三、系统信息与进程管理

命令说明常用示例
top实时显示系统进程和资源使用情况top (按q退出)
ps显示当前进程ps aux (显示所有进程), ps -ef
free显示内存使用情况free -h (人性化显示)
df显示磁盘空间使用情况df -h (人性化显示), df -i (显示inode)
du查看文件/目录磁盘使用情况du -sh dir (显示目录大小), du -h
uptime显示系统运行时间uptime
uname查看系统信息uname -a (显示所有系统信息)
kill终止进程kill -9 PID (强制终止进程)
killall终止所有同名进程killall nginx
nohup在后台运行命令nohup ./script.sh &

四、网络管理

命令说明常用示例
ping测试网络连通性ping -c 4 www.baidu.com (发送4次)
ifconfig查看/配置网络接口ifconfig eth0
netstat显示网络连接和状态netstat -tuln (显示所有监听端口)
ssh远程登录ssh user@remote_host
scp安全复制文件scp file.txt user@remote:/path/
sftp通过SSH上传/下载文件sftp user@remote_host
traceroute跟踪数据包路径traceroute www.baidu.com
digDNS查询dig example.com

五、权限管理

命令说明常用示例
chmod修改文件权限chmod 755 file.txt, chmod -R 755 dir
chown修改文件所有者chown user:group file.txt
chgrp修改文件所属组chgrp group file.txt
su切换用户su - (切换到root), su - username
sudo以管理员权限执行命令sudo apt update

六、系统服务与包管理

命令说明常用示例
systemctl管理系统服务systemctl start nginx, systemctl status nginx
aptDebian/Ubuntu软件包管理apt update, apt install nginx, apt remove nginx
yumCentOS/RHEL软件包管理yum update, yum install httpd, yum remove httpd
dnf新版RHEL/CentOS软件包管理dnf update, dnf install nginx
reboot重启系统reboot
shutdown关机系统shutdown -h now

ssh的root登录

  1. 修改SSH配置文件 打开SSH配置文件,通常位于/etc/ssh/sshd_config。使用文本编辑器打开文件,如vi或nano。
sudo vim /etc/ssh/sshd_config
  1. 找到以下行并进行相应的更改:
    • PermitRootLogin:将其设置为yes以允许root用户远程登录。如果该行被注释掉(以#开头),请取消注释并设置其值为yes。
    • PasswordAuthentication:将其设置为yes以允许使用密码进行身份验证。如果该行被注释掉,请取消注释并设置其值为yes。 示例配置:
PermitRootLogin yes
PasswordAuthentication yes
  1. 保存并关闭文件。
  2. 重启SSH服务以使更改生效。
sudo systemctl restart ssh
  1. 现在,您可以使用root用户和密码从远程计算机登录到Linux服务器。

关键配置文件

文件用途
/etc/passwd用户账户信息(用户名、UID、GID、家目录、shell)
/etc/shadow加密密码和密码策略(仅 root 可读)
/etc/group组信息
/etc/gshadow组密码(很少使用)
/etc/sudoerssudo 权限配置
/etc/login.defs用户创建的默认配置(UID 范围、密码策略等)
/etc/default/useradduseradd 命令默认值
/etc/skel/新用户家目录模板文件

权限数字表

数字权限说明
7rwx读+写+执行
6rw-读+写
5r-x读+执行
4r--只读
0---无权限
常见组合:
  • 755 (rwxr-xr-x) - 目录默认,所有人可进入
  • 644 (rw-r--r--) - 文件默认,所有者可修改
  • 700 (rwx------) - 私有,仅自己访问
  • 750 (rwxr-x---) - 组内共享,外人不可见
  • 777 (rwxrwxrwx) - 开放(危险!)

用户操作

# 切换用户
su - [用户名]
# 查看当前用户
whoami
# 查看用户的UID、GID、所属组
id [用户名]
# 列出用户名
users

修改用户密码

普通用户时,初次登录root需要修改密码。

sudo passwd [用户名]

文件解压缩

7z文件

# 安装
apt install p7zip-full
# 压缩文件
7z a [压缩后的文件名] [需要压缩的文件1] [需要压缩的文件2] [需要压缩的文件3] ......
# 压缩文件目录
7z a [压缩后的文件名] [压缩后的文件目录名] 
# 解压文件 -o后面没有空格
7z x [需要解压文件名] -o[解压到目标的文件夹名]
# 查看压缩文件的内容
7z l [需要解压文件名]
# 添加新文件到旧压缩包
7z u [压缩包的名字] [待添加的文件名]
# 删除压缩包内文件
7z d  [压缩包的名字] [待删除的文件名]

zip文件

# 安装
apt install zip unzip 
# 压缩多个文件
zip [压缩后的文件名] [需要压缩的文件1] [需要压缩的文件2] [需要压缩的文件3] ......
# 递归压缩目录及所有子内容(最常用),如果不是r,打包的是空目录
zip -r [压缩后的文件名字] [需要压缩的目录名1] [需要压缩的目录名2] [需要压缩的目录名3] ......
# 压缩多个目录,排除临时文件
zip -r [压缩后的文件名字] [需要压缩的目录名1] [需要压缩的目录名2] ...... -x "*.tmp" "*.cache*"
# 添加新文件到现有压缩包
zip -u [压缩包名字] [需要添加的文件名字]
# 删除压缩包内的特定文件
zip -d [压缩包名字] [待删除的文件名字]

# 查看压缩包内容(不解压)
unzip -l [压缩包名字]

tar.gz文件

# 创建压缩包 (gzip压缩) 
tar -czvf [压缩包名字] [待压缩目录名字]
# 解压压缩包 
tar -xzvf [压缩包名字]

# 压缩文件 
gzip [待压缩文件名字]
# 解压缩文件 
gzip -d [压缩包名字]

grep

基础字符串搜索

grep <选项> [需要搜索的文本内容] [目标文件名字]
# 搜索文件中包含 "grep" ,忽略大小写,显示行号的行
grep -ni "grep" test.txt

匹配多个关键词

# 匹配包含 "hello" 或 "linux" 的行(用 | 分隔)
grep -E "hello|linux" test.txt
# 等价于 egrep "hello|linux" test.txt(egrep 是 grep -E 的简写)

结合管道(|)搜索

# 搜索进程中包含 "java" 的进程
ps -ef | grep "java"
# 搜索日志文件中包含 "ERROR" 的行(实时日志)
tail -f app.log | grep "ERROR"
# 搜索系统中包含 "root" 的用户
cat /etc/passwd | grep "root"

正则表达式

# 匹配以 "Hello" 开头的行(^ 表示行首)
grep "^Hello" test.txt
# 匹配以 "4" 结尾的行($ 表示行尾)
grep "4$" test.txt
# 匹配包含任意数字的行([0-9] 匹配数字)
grep "[0-9]" test.txt

其他选项

选项解释备注
i忽略大小写
n显示匹配行的行号
v显示不包含指定内容的行
o只输出匹配的字符串
B显示匹配行的前N行before
A显示匹配行的后N行after
C显示匹配行的前后N行context
r递归搜索目录下的所有文件
c统计匹配行数c是小写

top

top 是实时性能监控工具。它主要用于动态地查看系统中各个进程的资源占用情况(如 CPU、内存等),类似于 Windows 系统中的“任务管理器”。普通用户:只能看到自己拥有的进程。Root 用户:可以看到系统中所有用户的进程。

常用命令行参数

启动时也可以直接指定参数,指定刷新间隔(默认为 3 秒):

top -d 2  # 每 2 秒刷新一次

只显示特定用户的进程:

top -u www-data  # 只看 www-data 用户的进程

只显示特定 PID 的进程:

top -p 1234,5678 # 只看 PID 为 1234 和 5678 的进程

批处理模式(输出一次后退出,常用于脚本记录):

top -b -n 1 > cpu_log.txt

image.png

top 的输出界面主要分为两部分:上半部分的统计信息区和下半部分的进程列表区。

上半部分:系统整体统计信息

通常显示前 5 行,包含以下关键数据:

  1. 第一行 (top - ...):
    • current time: 当前系统时间。
    • up ...: 系统运行时间(uptime)。
    • user: 当前登录的用户数。
    • load average: 系统负载平均值(分别代表过去 1 分钟、5 分钟、15 分钟的平均负载)。
  2. 第二行 (Tasks):
    • total: 进程总数。
    • running: 正在运行的进程数。
    • sleeping: 睡眠中的进程数。
    • stopped: 停止的进程数。
    • zombie: 僵尸进程数(如果此数值不为 0 且持续增加,说明有程序异常退出未释放资源)。
  3. 第三行 (%Cpu(s)):
    • us (user): 用户空间占用 CPU 百分比。
    • sy (system): 内核空间占用 CPU 百分比。
    • ni (nice): 改变过优先级的进程占用 CPU 百分比。
    • id (idle): 空闲 CPU 百分比。
    • wa (iowait): 等待 I/O 操作完成的 CPU 时间百分比(如果很高,说明磁盘读写可能是瓶颈)。
    • hi/si: 硬件/软件中断占用。
    • st (steal): 虚拟化环境中被其他虚拟机占用的 CPU 时间。
  4. 第四行 (KiB Mem): 物理内存使用情况。
    • total: 总内存。
    • free: 空闲内存。
    • used: 已用内存。
    • buff/cache: 用于缓冲和缓存的内存(Linux 会自动利用空闲内存做缓存,这部分在应用需要时通常可释放)。
  5. 第五行 (KiB Swap): 交换分区(虚拟内存)使用情况。
    • 如果 used 很高且 free 很低,说明物理内存不足,系统正在频繁使用磁盘作为内存,会导致性能急剧下降。

下半部分:进程列表

默认按 CPU 使用率排序,主要列含义如下:

  • PID: 进程 ID。
  • USER: 进程所有者。
  • PR / NI: 优先级 (Priority) / Nice 值。
  • VIRT: 虚拟内存使用量(进程申请的总内存,包含未实际使用的)。
  • RES: 常驻内存(实际使用的物理内存,不含 Swap)。这是判断内存占用最关键的指标。单位通常是 KiB
  • SHR: 共享内存大小。
  • S: 进程状态 (R=运行, S=睡眠, D=不可中断睡眠, Z=僵尸)。
  • %CPU: CPU 使用率。
  • %MEM: 内存使用率。
  • TIME+: 进程累计占用的 CPU 时间。
  • COMMAND: 启动进程的命令名称或完整路径。

常用交互快捷键

top 运行过程中,可以按下以下按键进行实时操作(无需重启命令):

按键功能描述
E切换上半部分(系统总内存统计)的单位
e切换下半部分(进程列表 RES 列)的单位
P (大写)按 CPU 使用率排序(默认)。
M (大写)按 内存 (Memory) 使用率排序。
T (大写)按 CPU 时间 (Time+) 排序。
N (大写)按 PID 排序。
k杀死指定 PID 的进程(输入 PID 后确认)。
r调整指定进程的 Nice 值(优先级)。
c切换显示命令的完整路径还是仅显示命令名。
fF进入字段管理界面,可以选择显示或隐藏某些列。
1 (数字)展开显示所有 CPU 核心的详细使用情况(默认是汇总显示)。
z切换彩色/黑白显示模式。
q退出 top。
h显示帮助菜单。

总结:当你发现服务器变慢、风扇狂转或程序无响应时,top 是你的第一诊断工具:

  1. 看 Load Average 判断整体负载。
  2. 看 %Cpu(s) 中的 wa 判断是否是磁盘 I/O 瓶颈。
  3. 按 M 键查找是否由内存泄漏导致。
  4. 按 P 键找出是哪个“坏”进程占用了 CPU。

ps

ps 查看当前时刻进程快照的命令。静态快照,适合用于脚本编写、查找特定进程 PID 以便杀死进程,或者在系统负载极高无法运行 top 时使用。

常用的组合

查看所有进程的详细信息 (最常用),快速浏览系统所有进程,查看进程的父子关系(PPID)。

# -e: 显示所有进程 (every process)。
# -f: 全格式输出 (full-format),包含 UID, PID, PPID, 启动时间, 命令等。
ps -ef

查看当前终端下的所有进程 (含其他用户)

# a: 显示所有用户的进程 (all)。
# u: 以用户为主的格式 (user-oriented),显示 CPU/内存占用、启动用户等。
# x: 显示没有控制终端的进程 (通常指后台守护进程)。
ps aux

输出列详解 (以 ps aux 为例) image.png

列名含义说明
USER用户进程所有者。
PID进程 ID唯一标识符。
%CPUCPU 占用进程占用的 CPU 百分比。
%MEM内存占用进程占用的物理内存百分比。
VSZ虚拟内存虚拟内存大小 (单位 KB)。
RSS常驻内存实际物理内存大小 (单位 KB),对应 top 中的 RES。
TTY终端进程关联的终端。? 表示无终端 (通常是后台服务)。
STAT状态进程状态代码 (见下文)。
START启动时间进程启动的时间或日期。
TIMECPU 时间进程累计使用的 CPU 时间。
COMMAND命令启动进程的命令及参数。

常见 STAT 状态代码:

  • R: 运行中 (Running)。
  • S: 睡眠中 (Sleeping),等待事件完成。
  • D: 不可中断睡眠 (通常是在等待 I/O,如磁盘读写)。
  • Z: 僵尸进程 (Zombie),已终止但未被父进程回收。
  • T: 停止/追踪 (Stopped)。
  • <: 高优先级。
  • N: 低优先级。

高级筛选与查找技巧

查找特定进程 (配合 grep),这是运维中最常见的操作,例如查找 nginx 进程:

ps aux | grep nginx

查看特定用户的进程

ps -u www-data
# 或者
ps -U www-data -u www-data

查看特定 PID 的进程

# -o: 自定义输出格式 (output),只显示你关心的列。
ps -p 1234,5678 -o pid,ppid,cmd,%mem,%cpu

查看进程树 (父子关系),如果想清晰看到谁启动了谁:

# --forest 或 j 会以树状结构缩进显示,非常直观地展示进程层级。
ps -ef --forest
# 或者
ps axjf

按内存占用排序的前 10 个进程

# head -n 11 是因为第一行是表头
ps aux --sort=-%mem | head -n 11

5. 实用场景总结

  1. 我想杀掉一个卡死的程序:
    • 先用 ps aux | grep 程序名 找到 PID。
    • 再用 kill -9 PID 杀掉。
  2. 我想看某个用户跑了什么:
    • ps -u 用户名 -f
  3. 我想写一个脚本监控进程是否存在:
    • 在脚本中使用 ps -p PIDpgrep 进程名 (pgrep 是 ps 的衍生工具,专门用于查找 PID)。
  4. 系统卡死,top 都打不开:
    • ps 通常比 top 更轻量,能更快给出一个当前的进程列表 snapshot。

补充:pgreppkill,现代 Linux 系统中,为了简化 ps | grep 的操作,推荐使用:

  • pgrep nginx: 直接返回 nginx 进程的 PID 列表。
  • pkill nginx: 直接杀死所有名为 nginx 的进程。

free

free 是用于查看内存使用情况的命令。显示的不仅仅是空闲内存,而是包括总内存、已用内存、共享内存、缓冲/缓存以及可用内存在内的完整概览。对于系统管理员和开发者来说,正确解读 free 的输出(尤其是 available 列)至关重要,因为 Linux 的内存管理机制与 Windows 有所不同。

基本用法

最常用的命令是加上 -h 参数,以人类可读的单位(Human-readable)显示:

free -h
  • 不加 -h:默认单位是 KiB ,数字很大,不易读。
  • -m:以 MB 为单位。
  • -g:以 GB 为单位。
  • -s <秒>:持续监控,每隔指定秒数刷新一次(类似 top 的内存部分)。例如:free -h -s 2 (每 2 秒刷新一次)。
  • -t:在输出底部增加一行 "total",显示物理内存和 Swap 的总和。

输出详解

执行 free -h 后,你会看到类似下面的输出: image.png

  1. total: 物理内存总量。
  2. used: 已使用的内存。在旧版 Linux 或某些理解中,used = total - free。但这包含了用于缓存(buff/cache)的内存,所以这个数值通常看起来很大,不代表应用程序实际占用了这么多。
  3. free: 完全未被使用的内存。这部分内存是空的,没有任何数据。Linux 倾向于“不浪费内存”,所以这个值通常很小。
  4. shared: 多个进程共享的内存总额(主要是 tmpfs/shmem)。
  5. buff/cache: 缓冲区 + 缓存。Buffer: 用于块设备(如磁盘)的读写缓冲。Cache: 用于文件系统的页缓存(Page Cache)。
  6. available: 应用程序可用内存估算值(最重要的一列!)。
    • 这是判断内存是否充足的金标准。
    • 计算公式大致为:available ≈ free + (可回收的 buff/cache)
    • 如果这个值很低(例如小于总内存的 10%),才说明系统真的缺内存了,可能需要增加内存或检查内存泄漏。
    • 不要只看 free 列!如果 free 很小但 available 很大,说明系统非常健康,只是利用了内存做缓存。
  7. Swap 行含义:
  • total: 交换分区(虚拟内存)总量。
  • used: 已使用的 Swap 大小。如果此值持续很高,说明物理内存不足,系统正在频繁使用磁盘作为内存,会导致性能严重下降(抖动)。
  • free: 剩余的 Swap 空间。 实用场景示例
  1. 快速检查内存是否充足
# 关注 available 列。如果它是总内存的 20% 以上,通常很安全。
free -h
  1. 监控内存变化(排查内存泄漏)如果你怀疑某个程序有内存泄漏,可以每秒刷新一次观察 usedavailable 的趋势:
free -h -s 1
  • 如果 available 持续下降且不回升,而 buff/cache 没有相应减少,可能存在内存泄漏。 在脚本中获取具体数值
  1. 如果你需要在脚本中判断内存使用率,可以使用 -b (bytes) 配合 awk 提取:
# 获取可用内存百分比
free | awk '/Mem:/ {printf("Available: %.2f%%\n", $7/$2 * 100)}'

如何一眼判断内存状态?

指标状态判断建议操作
available高(>20% 总内存)系统健康,无需担心。
available低 (<10% 总内存)内存紧张,需检查占用高的进程 (top 按 M 排序)。
swap used持续增长物理内存严重不足,系统性能将大幅下降。需立即干预(加内存或优化应用)。
buff/cache很大正常现象,说明系统在有效利用内存加速 I/O。

记住口诀:不看 free 看 available,swap 用了要警惕,cache 大了是好事。

ip

管理 IP 地址

  1. 查看所有接口的 IP 信息:
ip addr show
# 或者简写
ip a

输出解读:

  • inet: IPv4 地址及掩码长度(如 /24 代表 255.255.255.0)。
  • inet6: IPv6 地址。
  • scope host: 本地回环。
  • scope global: 全局可用 IP。
  • valid_lft: 地址有效寿命(DHCP 获取的地址会有此限制)。

>> 与>

  1. >>:追加
  2. > :覆盖写入
explode@explode:~/linux$ touch eorr.txt && echo 'hauhau' > eorr.txt
explode@explode:~/linux$ cat eorr.txt
hauhau
explode@explode:~/linux$ echo 'huahua2' > eorr.txt
explode@explode:~/linux$ cat eorr.txt
huahua2
explode@explode:~/linux$ echo 'huahua3' >> eorr.txt
explode@explode:~/linux$ cat eorr.txt
huahua2
huahua3