Linux 运维的"基本功"是命令。新人最大的痛苦不是不会用某个工具,而是不知道有这工具存在。老工程师经常 5 分钟搞定的事,新人翻文档 2 小时。
这篇文章把所有高频命令按"场景"分类,每个命令给:
不写"Hello World"级别的 demo,全部按生产场景来。学完这一篇,日常 80% 的运维操作能直接照着敲。
适用读者:
unamehostname, uptime, date, cal, who, w, last | |
pstop, htop, pidof, pgrep, pkill, kill, pstree, nice, renice, systemctl | |
topmpstat, sar -u, vmstat, lscpu, turbostat, perf top | |
freevmstat, sar -r, slabtop, smem, pmap, numastat | |
ipss, netstat, curl, wget, tcpdump, iftop, nethogs, mtr, traceroute, nc, ethtool, sar -n | |
dfdu, lsblk, blkid, mount, fdisk, parted, iostat, iotop, fuser, lsof | |
findlocate, stat, file, tree, ls, chmod, chown, ln, rsync, scp, tar, zip | |
tailhead, less, grep, awk, sed, journalctl, dmesg, logrotate | |
useraddusermod, userdel, passwd, chage, groupadd, id, su, sudo | |
systemctljournalctl, systemd-analyze | |
yumdnf, apt, rpm, dpkg | |
crontabat, flock | |
straceltrace, perf, bcc, bpftrace | |
grepawk, sed, xargs, sort, uniq, cut, tr, column | |
tmuxscreen, glances, dstat, nmon, sysstat |
下面分类详讲。
uname -a# Linux host-01 5.15.0-91-generic #101-Ubuntu SMP Tue Nov 14 13:30:08 UTC 2023 x86_64 x86_64 x86_64 GNU/Linuxuname -r# 5.15.0-91-generic# 看内核版本,模块编译时要用uname -m# x86_64# 看架构,aarch64 / x86_64 / i686hostname# 看主机名hostnamectl set-hostname redis-prod-01# 永久改主机名(systemd 机器)hostname -I# 看所有 IPuptime# 14:30:00 up 200 days, 10:00, 3 users, load average: 0.50, 0.40, 0.30# - up 200 days:开机时间# - 3 users:登录用户数# - load average:1 / 5 / 15 分钟平均负载# 负载除以 CPU 核数,> 1 说明忙date# 看时间date -s "2026-06-13 14:30:00"# 改时间(生产别瞎改,会打乱业务)date -d "@1700000000"# 时间戳转时间date +%s# 当前时间戳date -d "yesterday" +%Y-%m-%d# 算昨天w# 看当前登录的用户,正在做什么# 14:30:00 up 200 days, 3 users, load average: 0.50, 0.40, 0.30# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT# root pts/0 10.20.0.100 14:00 0.00s 0.10s 0.00s wwho# 看登录用户,简版last# 看历史登录,从 /var/log/wtmp 读# 排查谁登陆过服务器last -i# 看 IP# BSD 风格ps aux# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND# root 1 0.0 0.0 169404 11556 ? Ss Jun10 0:08 /sbin/init# System V 风格ps -ef# UID PID PPID C STIME TTY TIME CMD# 看指定进程ps -ef | grep nginx# 按 CPU 排序ps aux --sort=-%cpu | head# 按内存排序ps aux --sort=-%mem | head# 看进程树ps auxf# 详细字段ps -eo pid,ppid,user,stat,pcpu,pmem,vsz,rss,etime,cmd# etime:进程运行时长# 看线程ps -eLf# LWP(线程 ID)列top# 进入交互:# - P:按 CPU 排序# - M:按内存排序# - T:按时间排序# - 1:展开多核 CPU# - c:显示完整命令行# - V:森林视图(进程树)# - k:kill 进程# - r:renice# 一次性输出,不进入交互top -bn1 | head -20# 字段含义:# %CPU:CPU 占用# %MEM:内存占用# VSZ:虚拟内存大小# RSS:实际物理内存# STAT:状态# R:运行# S:睡眠(可中断)# D:不可中断睡眠(等 IO)# Z:僵尸# T:停止# I:空闲# <:高优先级# N:低优先级# L:有锁页在内存# s:会话首进程# +:前台进程组yum install -y htophtop# 比 top 直观,鼠标可点# - F2:配置# - F3:搜索# - F4:过滤# - F5:树状# - F6:排序列# - F9:kill# - F10:退出# 找 PIDpidof nginx# 1234 5678pgrep -f nginx# 按命令行匹配pgrep -u mysql mysqld# 按用户匹配# 杀进程pkill nginx# 杀所有 nginxpkill -9 -f "python.*app.py"# -9:SIGKILL# -f:按命令行# 慎用 pkill 模糊匹配,可能误杀# 信号# 1 SIGHUP:重新加载配置(nginx -s reload)# 2 SIGINT:中断(Ctrl+C)# 9 SIGKILL:强制杀# 15 SIGTERM:优雅退出(默认)# 18 SIGCONT:继续# 19 SIGSTOP:暂停kill <pid># 优雅退出,给进程清理时间kill -9 <pid># 强制杀,可能丢数据# 按进程名killall nginxpkill nginx# 杀指定用户进程pkill -u username# 列所有信号kill -l风险提示:kill -9 是高危命令,会跳过进程的清理逻辑:
# 调整进程优先级# nice 范围 -20 ~ 19,-20 最高# 普通用户只能 0 ~ 19# root 可以 -20 ~ 19# 启动时设优先级nice -n 10 python3 backup.py# 调整已运行进程renice -n -5 -p 1234# 把 PID 1234 的优先级调为 -5# 看进程的 nicetop# NI 列# 服务管理systemctl start nginxsystemctl stop nginxsystemctl restart nginxsystemctl reload nginx# 重新加载配置,不中断(nginx / haproxy 支持)systemctl status nginx# 看服务状态、日志、PIDsystemctl enable nginx# 开机自启systemctl disable nginx# 禁用开机自启systemctl is-active nginx# 是否在运行systemctl is-enabled nginx# 是否开机自启systemctl list-units --type=service# 列出所有 servicesystemctl list-units --state=failed# 看失败的服务systemctl mask nginx# 禁用服务(连手动起都起不来)systemctl daemon-reload# 重载 systemd 配置风险提示:systemctl mask 会创建 /dev/null 软链,禁用后连 systemctl start 都起不来。要恢复用 systemctl unmask。
lscpu# Architecture: x86_64# CPU op-mode(s): 32-bit, 64-bit# Byte Order: Little Endian# CPU(s): 16# On-line CPU(s) list: 0-15# Thread(s) per core: 2# Core(s) per socket: 8# Socket(s): 1# NUMA node(s): 2# ...# 16 核、超线程、2 个 NUMA nodeyum install -y sysstatmpstat -P ALL 1# -P ALL:所有 CPU# 1:1 秒一次# 14:30:00 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle# 14:30:01 all 5.00 0.00 2.00 1.00 0.00 0.00 0.00 0.00 92.00# 14:30:01 0 6.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 92.00# ...# 关键:# %usr:用户态# %sys:内核态# %iowait:等 IO# %idle:空闲# %steal:被虚拟化偷走的时间sar -u 1 5# CPU 利用率,1 秒一次取 5 次# 看历史(需要 sysstat 收集器)sar -u -f /var/log/sa/sa13# 看 13 号的 CPU 历史# 看 CPU 频率、C-state、实际跑的频率yum install -y kernel-toolsturbostat --interval 5# 5 秒一次输出# 关键:# Avg_MHz:实际平均频率# Bzy_MHz:忙时的频率# TSC_MHz:标称频率# 如果 Avg_MHz 远低于 TSC_MHz,CPU 在节电,可能影响性能yum install -y perf# top 类似perf top# 默认按调用栈展示热点函数# -g:显示调用栈# 录 10 秒perf record -a -g sleep 10perf report# 看报告# 看指定进程perf top -p <pid># 看 cache missperf stat -e cache-misses,cache-references -p <pid> sleep 5风险提示:perf record -a 在生产慎用,会记录所有 CPU 事件,存储压力很大。
free -h# total used free shared buff/cache available# Mem: 62G 20G 30G 1.0G 12G 40G# Swap: 4.0G 100M 3.9G# 关键:# total:总内存# used:已用(不含 buff/cache)# free:完全空闲# shared:共享内存(/dev/shm)# buff/cache:页缓存和 buffer# available:实际可用(free + 可回收的 buff/cache)cat /proc/meminfo# MemTotal: 65876988 kB# MemFree: 31457280 kB# MemAvailable: 41943040 kB# Buffers: 1024000 kB# Cached: 10240000 kB# SwapCached: 0 kB# Active: 12345678 kB# Inactive: 5678900 kB# Dirty: 12345 kB# Writeback: 0 kB# AnonPages: 15728640 kB# Mapped: 524288 kB# ...# 关键:# Dirty:脏页(待写盘)# Writeback:正在写盘的页# AnonPages:匿名页(堆、栈)# Mapped:被 mmap 的文件页slabtop# 看内核 slab 分配器的占用# 排查内核内存泄漏常用# top 字段:# OBJS:对象数# ACTIVE:活跃对象# USE:每个对象大小# SIZE:总大小yum install -y smemsmem -tk# 按 RSS / PSS / USS 排序# PSS(Proportional Set Size)更准确,多进程共享的库按比例算# 看指定用户smem -u mysql# 看指定进程smem -p <pid># 看进程内存映射pmap -x <pid># Address Kbytes RSS Dirty Mode Mapping# 00007f1234000000 524288 524288 0 r-x-- libmysqlclient.so.21.0.30# 00007f1246000000 128 128 0 r-x-- [vdso]# ...# 看内存峰值pmap -x <pid> | tail -1# total kB 524288 524288 0yum install -y numactlnumastat -m# 看 NUMA 节点内存分配# 跨 NUMA 访问性能差,要避免# Per-node numastat 0# Node 0 Node 1# Numa_Hit 12345678 12345678# Numa_Miss 1234 5678# Foreign 0 0# Interleave_Hit 123456 123456# Local_Node 12000000 12000000# Other_Node 12345 12345# 替代 ifconfigip a# 看所有 IPip addr show eth0ip link show# 看链路状态ip r# 看路由表ip route get 8.8.8.8# 查具体走哪条路由# 加 IPip addr add 10.20.0.20/24 dev eth0# 删 IPip addr del 10.20.0.20/24 dev eth0# 起 / 关网卡ip link set eth0 upip link set eth0 down# 加路由ip route add 192.168.0.0/16 via 10.20.0.1# 删路由ip route del 192.168.0.0/16 via 10.20.0.1# 替代 netstatss -tunap# -t:TCP# -u:UDP# -n:数字(不解析服务名)# -a:所有# -p:显示进程# 看监听端口ss -tlnp# 看连接数ss -s# TCP: 100 (estab 80, closed 10, orphaned 0, timewait 5)# ...# 看 timewaitss -tan state time-wait | wc -l# 看 establishedss -tan state established | wc -l# 按状态统计ss -tan | awk 'NR>1{print $1}' | sort | uniq -c# 还能用,但推荐迁到 ssnetstat -tunlpnetstat -an | grep ESTABLISHED | wc -lnetstat -s# 各种协议统计# HTTP 调试curl -v https://example.com# -v:详细curl -X POST -d "key=value" https://api.example.com/userscurl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' https://api.example.com/userscurl -H "Authorization: Bearer xxx" https://api.example.com# 看响应头curl -I https://example.com# 保存文件curl -O https://example.com/file.zipcurl -o file.zip https://example.com/file.zip# 限速curl --limit-rate 1m -O https://example.com/bigfile.iso# 走代理curl -x http://proxy.example.com:8080 https://example.com# 测速curl -o /dev/null -s -w "time_total: %{time_total}\n" https://example.com# 多次请求curl -o /dev/null -s -w "%{time_total}\n" -H 'Cache-Control: no-cache' https://example.com/api# 拿 P50 / P99for i in {1..100}; do curl -o /dev/null -s -w "%{time_total}\n" https://example.com/apidone | sort -n | awk '{a[NR]=$1}END{print "P50:" a[int(NR*0.5)]; print "P99:" a[int(NR*0.99)]}'# 下载wget https://example.com/file.zip# 断点续传wget -c https://example.com/bigfile.iso# 限速wget --limit-rate=1m https://example.com/bigfile.iso# 镜像整个网站wget -m -p -k https://example.com# 整页保存wget -p -k -E -np https://example.com/page.html# 抓包tcpdump -i eth0# 指定网卡tcpdump -i eth0 port 80# 端口过滤tcpdump -i eth0 host 10.20.0.10# 主机过滤tcpdump -i eth0 src 10.20.0.10# 源 IP 过滤tcpdump -i eth0 dst port 6379# 目标端口tcpdump -i eth0 -w capture.pcap# 保存到文件tcpdump -r capture.pcap# 读取文件# 抓 HTTP 请求tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'# 抓 DNStcpdump -i eth0 port 53# 看 TCP 握手tcpdump -i eth0 -nn -S 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'风险提示:tcpdump 在生产慎用,可能捕获敏感信息(密码、token)。抓包文件要妥善保管。
yum install -y iftopiftop -i eth0# 实时看网络流量# -i:网卡# -n:不解析 IP# -N:不解析端口# -B:以 byte/s 显示# 看本机 IP 的流量iftop -i eth0 -f "src host 10.20.0.10"yum install -y nethogsnethogs eth0# 按进程看网络流量# 看到哪个进程在狂用带宽yum install -y mtrmtr -r 8.8.8.8# -r:report 模式# 输出到目的地每一跳的丢包率 / 延迟# 持续mtr 8.8.8.8# Ctrl+C 退出# 看 TCP 路径mtr --tcp example.comtraceroute 8.8.8.8# 看路由路径# 走 TCPtraceroute -T example.com# 走 ICMPtraceroute -I example.com# 测端口nc -zv 10.20.0.10 80# -z:只测端口不开连接# -v:详细# 监听端口(调试用)nc -l 12345# 发送数据echo"hello" | nc 10.20.0.10 12345# 文件传输# 接收端nc -l 12345 > file# 发送端nc 10.20.0.10 12345 < file# 端口扫描nc -zv 10.20.0.10 20-30风险提示:nc 监听端口可能带来安全风险,生产慎用。
# 看网卡信息ethtool eth0# 看网卡驱动ethtool -i eth0# 看网卡 ring bufferethtool -g eth0# 看网卡统计ethtool -S eth0# 改网卡速率(高危)# ethtool -s eth0 speed 1000 duplex full autoneg off# 不建议临时改# 实时sar -n DEV 1# -n DEV:网卡流量# IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil# eth0 1234.00 5678.00 100.00 500.00 0.00 0.00 0.00 0.00# TCP / ETCPsar -n TCP,ETCP 1# active/s:每秒主动建立连接# passive/s:每秒被动接受连接# retrans/s:每秒重传# 历史sar -n DEV -f /var/log/sa/sa13df -h# 人性化单位df -i# 看 inodesdf -T# 看文件系统类型df --total# 汇总du -sh /*# 各级目录大小du -sh /var/log/*# 详细目录du -h --max-depth=1 /var/log# 限制深度# 排序du -sh /var/log/* | sort -h | tail# 排除du -sh --exclude='*.log' /var# 看大于 1G 的文件find / -type f -size +1G -exec du -sh {} \; 2>/dev/null | sort -hlsblk# 块设备树状结构lsblk -f# 看文件系统、UUIDlsblk -d -o NAME,SIZE,MODEL,ROTA,TRAN# 看物理盘类型lsblk -o NAME,SIZE,USED,AVAIL,FSTYPE,MOUNTPOINT,UUID# 详细mount# 看所有挂载mount | grep sda# 过滤mount -o remount,rw /data# 重新挂载mount -t nfs 10.20.0.100:/nfs /mnt/nfsumount /data# 卸umount -f /data# 强制fuser -m /data# 看谁在用iostat -xz 1# -x:扩展# -z:忽略 0 活动# 1:1 秒一次# 输出每个设备的 r/s、w/s、rkB/s、wkB/s、await、%util 等iotop# 按进程看 IOiotop -ao# -a:累计# -o:只显示有 IO 的进程# 看谁在用这个文件 / 目录fuser -m /data# 列出 PID# 杀占用fuser -km /data# -k:杀# -m:挂载点# 风险:会 kill 占用进程,先确认# 看进程开了哪些文件lsof -p <pid># 看谁在用这个文件lsof /var/log/messages# 看谁在用这个目录lsof +D /data# 看谁占用端口lsof -i :80# 看 TCP 连接lsof -i tcp# 按名字find / -name "*.log"# 按类型find / -type f -name "*.log"# -type f:文件# -type d:目录# -type l:软链# 按大小find / -type f -size +1G# +1G:大于 1G# -1G:小于 1G# 按时间find / -type f -mtime +7# mtime +7:7 天前修改# mtime -7:7 天内修改# mtime 7:刚好 7 天# atime:访问时间# ctime:变化时间# 按用户find / -user mysql# 按权限find / -perm 777# 执行操作find / -name "*.log" -exec rm {} \;# 注意 \; 转义# 或者用 + 减少 forkfind / -name "*.log" -exec rm {} +# 限制深度find / -maxdepth 3 -name "*.log"# 多个条件find / -type f \( -name "*.log" -o -name "*.tmp" \)# 找 .log 或 .tmp# 排除目录find / -path "/proc" -prune -o -name "*.log" -print# 输出格式find / -name "*.log" -printf"%s %p\n"# 打印大小 路径# 找大文件并排序find / -type f -size +100M -exec du -h {} \; 2>/dev/null | sort -hr | head -20yum install -y mlocateupdatedb# 建索引(生产慎用,扫全盘 IO 大)locate nginx.conf# 快速找# 局限:updatedb 之后新增的文件找不到# 优势:比 find 快得多stat file.txt# File: file.txt# Size: 1234 Blocks: 8 IO Block: 4096 regular file# Access: 2026-06-13 14:00:00.000000000 +0800# Modify: 2026-06-13 14:00:00.000000000 +0800# Change: 2026-06-13 14:00:00.000000000 +0800# Birth: 2026-06-13 14:00:00.000000000 +0800file file.txt# 看文件类型file -i file.txt# 看 MIMEyum install -y treetree /data# 树状结构tree -L 2 /data# 限制 2 层tree -h /data# 人性化大小tree -I "*.log|cache" /data# 排除# 权限chmod 755 file# 7:rwx# 6:rw-# 5:r-x# 4:r--# 3:-wx# 2:-w-# 1:--x# 0:---# 字母模式chmod u+x file # 用户加执行chmod g+w file # 组加写chmod o-r file # 其他去读chmod a+x file # 所有人加执行# 递归chmod -R 755 /data# 风险提示:chmod -R 777 / 是灾难性操作,会破坏系统安全# 属主chown mysql:mysql filechown -R mysql:mysql /data# 改组chown :mysql file# 软链ln -s /data/file.txt /tmp/file.txt# 硬链ln /data/file.txt /tmp/file.txt# 软链常用场景:# - 链接到当前版本的代码# - 链接到日志目录# 看软链指向readlink /tmp/file.txt# /data/file.txt# 本地同步rsync -av /src/ /dst/# 末尾 / 表示目录内容# 不带 / 表示目录本身# 远程同步rsync -av /src/ user@remote:/dst/# 排除rsync -av --exclude='*.log' /src/ /dst/# 断点续传rsync -avP /src/ user@remote:/dst/# 删除目标多余文件(同步删除)rsync -av --delete /src/ /dst/# 风险:--delete 目标端多出来的文件会被删,先 dry-run# dry-runrsync -avn --delete /src/ /dst/# 限速rsync -av --bwlimit=10m /src/ user@remote:/dst/# 走 ssh keyrsync -av -e "ssh -i /root/.ssh/id_rsa" /src/ user@remote:/dst/# 上传scp file.txt user@remote:/data/# 下载scp user@remote:/data/file.txt /tmp/# 目录scp -r /data/dir user@remote:/data/# 限速scp -l 1000 file.txt user@remote:/data/# -l 1000:限 1000 Kbit/s# 走 keyscp -i /root/.ssh/id_rsa file.txt user@remote:/data/# 打包tar -cvf archive.tar /data# -c:创建# -v:详细# -f:文件# 解包tar -xvf archive.tar# 看内容不解tar -tvf archive.tar# gzip 压缩tar -czvf archive.tar.gz /data# -z:gzip# 解 gziptar -xzvf archive.tar.gz# bzip2 压缩tar -cjvf archive.tar.bz2 /data# -j:bzip2# xz 压缩(最高压缩比)tar -cJvf archive.tar.xz /data# -J:xz# 解到指定目录tar -xvf archive.tar -C /dst/# 排除tar --exclude='*.log' -czvf archive.tar.gz /data# 压zip -r archive.zip /data# 解unzip archive.zip# 解到指定目录unzip archive.zip -d /dst/# 看内容unzip -l archive.zip# 排除zip -r archive.zip /data -x "*.log"# 看文件尾tail file.log# 默认 10 行tail -n 100 file.log# 100 行tail -f file.log# 实时跟踪(ctrl+c 退出)tail -F file.log# -F:跟踪 + 重试(文件被删重建也能继续追)# 强烈推荐 -F# 翻页查看less file.log# 空格下一页,b 上一页,/搜索,q 退出# 打开就跳到尾less +F file.log# 类似 tail -f# 多个文件less file1.log file2.log# :n 下一个,:p 上一个# 基础grep "error" file.log# 找含 error 的行# 多个文件grep "error" *.loggrep -r "error" /var/log/# 大小写不敏感grep -i "error" file.log# 上下文grep -A 5 "error" file.log# -A 5:后面 5 行grep -B 5 "error" file.log# -B 5:前面 5 行grep -C 5 "error" file.log# -C 5:前后各 5 行# 反选grep -v "info" file.log# 不含 info# 计数grep -c "error" file.log# 行号grep -n "error" file.log# 正则grep -E "ERROR|WARN" file.log# 等价于 egrepgrep -E "192\.168\.[0-9]+\.[0-9]+" file.log# 匹配 IP# 限制目录grep -r --include="*.log""error" /var/log/# 排除目录grep -r --exclude-dir=".git""TODO" /src/# 统计grep -c "error" /var/log/*.log# 基础awk '{print $1}' file.log# 打印第一列awk '{print $1, $3}' file.log# 打印第 1 和 3 列# 自定义分隔符awk -F: '{print $1}' /etc/passwd# /etc/passwd 用 : 分隔# 条件awk '$3 > 100 {print $1}' file.log# 多个分隔符awk -F'[:,]''{print $1, $3}' file.log# 计数awk '{count++} END {print count}' file.log# 求和awk '{sum += $1} END {print sum}' file.log# 复杂条件awk '$3 > 100 && $4 == "OK" {print $0}' file.log# BEGIN / ENDawk 'BEGIN {print "start"} {print $1} END {print "end"}' file.log# 关联数组awk '{count[$1]++} END {for (k in count) print k, count[k]}' file.log# 按第一列分组计数# 处理 nginx access logawk '{print $1}' access.log | sort | uniq -c | sort -rn | head# 访问 IP 排行# 替换sed 's/old/new/' file.log# 替换每行第一个sed 's/old/new/g' file.log# 替换所有sed -i 's/old/new/g' file.log# 直接改文件# 风险:-i 不可逆,先备份或先输出# 删行sed '/pattern/d' file.log# 删含 pattern 的行sed '5d' file.log# 删第 5 行sed '5,10d' file.log# 删 5-10 行# 打印sed -n '5,10p' file.log# 打印 5-10 行# 多个命令sed -e 's/old/new/g' -e '/^$/d' file.log# 直接改文件sed -i.bak 's/old/new/g' file.log# 备份为 file.log.bak# 行尾添加sed 's/$/ END/' file.log# 行首添加sed 's/^/START /' file.log# 提取行sed -n '/start/,/end/p' file.log# 提取 start 到 end 之间的行风险提示:sed -i 是直接改文件,不可逆。先备份或先验证:
# 安全做法sed 's/old/new/g' file.log > newfile.log# 确认 OK 再覆盖mv newfile.log file.log# 看 systemd 日志journalctl# 跟某个服务journalctl -u nginx# 实时跟踪journalctl -u nginx -f# 时间范围journalctl --since "1 hour ago"journalctl --since "2026-06-13 14:00" --until "2026-06-13 15:00"# 优先级journalctl -p err# -p err:只显示 err 及以上# 0: emerg# 1: alert# 2: crit# 3: err# 4: warning# 5: notice# 6: info# 7: debug# 内核日志journalctl -k# 看启动日志journalctl -b# -b -1:上次启动# -b -2:上上次# 占用journalctl --disk-usage# 清理journalctl --vacuum-time=7djournalctl --vacuum-size=500M# 内核日志dmesg# 实时dmesg -w# 时间戳dmesg -T# 看指定级别dmesg --level=err,crit,alert,emerg# 看 OOMdmesg | grep -i "out of memory"# 看网卡dmesg | grep -i eth# 手动跑logrotate -f /etc/logrotate.conf# -f:强制跑(即使没到时间)# 看配置cat /etc/logrotate.d/nginx# 验证配置logrotate -d /etc/logrotate.conf# -d:debug,不真转# 加用户useradd -m -s /bin/bash username# -m:建 home# -s:指定 shell# 改用户usermod -aG sudo username# 加 sudo 组# 注意 -a 不能漏,否则覆盖# 改 shellusermod -s /bin/zsh username# 锁用户usermod -L username# 删用户userdel -r username# -r:连带 home# 改密码passwd username# 强制定期改chage -M 90 username# 90 天# 立即过期chage -d 0 username# 看密码策略chage -l usernamegroupadd developers# 加成员gpasswd -a username developers# 删成员gpasswd -d username developers# 看用户组id usernamegroups username# 切用户su - username# 加载环境变量# 跑单条命令sudo -u mysql /usr/bin/mysqld --version# 看 sudo 权限sudo -l# 改 sudo 配置visudo# 用 visudo 而不是直接 vim,会检查语法# 加一条username ALL=(ALL) NOPASSWD: ALL# ALL 主机# (ALL) 用户# NOPASSWD:免密风险提示:username ALL=(ALL) NOPASSWD: ALL 给某个用户全 sudo 免密,等于 root。
# 服务文件位置/etc/systemd/system//usr/lib/systemd/system/# 自定义服务cat > /etc/systemd/system/myapp.service << 'EOF'[Unit]Description=My ApplicationAfter=network.target[Service]Type=simpleUser=myuserWorkingDirectory=/opt/myappExecStart=/usr/bin/python3 /opt/myapp/main.pyRestart=alwaysRestartSec=5[Install]WantedBy=multi-user.targetEOFsystemctl daemon-reloadsystemctl start myappsystemctl enable myapp# 看启动耗时systemd-analyze# 看每个服务耗时systemd-analyze blame# 关键路径systemd-analyze critical-chain# 启动图systemd-analyze plot > /tmp/boot.svg# 浏览器打开 /tmp/boot.svg见 9.6。
# 装yum install -y nginxyum install -y epel-release# 卸yum remove nginx# 升级yum updateyum update nginx# 查包yum search nginxyum list | grep nginxyum info nginx# 看已装yum list installedyum list installed | grep nginx# 查某个文件属于哪个包yum provides /usr/bin/htop# 清理yum clean allyum makecache# 仓库yum repolistyum-config-manager --enable epel# 锁定版本yum install -y yum-plugin-versionlockyum versionlock nginx-1.20.1-1.el7# 装apt-get install -y nginx# 卸apt-get remove nginxapt-get purge nginx# purge:连配置一起删# 升级apt-get updateapt-get upgradeapt-get dist-upgrade# dist-upgrade 允许替换依赖关系# 查包apt-cache search nginxapt list --installed# 查文件apt-file search /usr/bin/htop# 没装先装 apt-file# apt-get install -y apt-file# apt-file update# 锁版本apt-mark hold nginxapt-mark unhold nginx# 装rpm -ivh package.rpm# -i:install# -v:verbose# -h:进度# 卸rpm -e nginx# 升级rpm -Uvh package.rpm# 查rpm -qarpm -qa | grep nginx# 看包详情rpm -qi nginx# 看包文件rpm -ql nginx# 查文件属于哪个包rpm -qf /usr/bin/htop# 装dpkg -i package.deb# 卸dpkg -r nginxdpkg -P nginx# -P:purge,连配置# 查dpkg -ldpkg -l | grep nginx# 查包文件dpkg -L nginx# 查文件属于哪个包dpkg -S /usr/bin/htop# 编辑crontab -e# 用户级 crontab# 看crontab -l# 删crontab -r# 风险:直接删整张表,慎用# 系统级/etc/crontab/etc/cron.d//etc/cron.daily//etc/cron.hourly//etc/cron.weekly//etc/cron.monthly/crontab 格式:
# 分 时 日 月 周 命令# 0 2 * * * /opt/backup.sh# */5 * * * * /opt/check.sh# 0 0 * * 0 /opt/weekly.sh# 30 9 * * 1-5 /opt/workday.sh# 防止脚本并发跑* * * * * flock -n /tmp/mytask.lock -c "python3 /opt/mytask.py"# -n:拿不到锁就放弃# /tmp/mytask.lock:锁文件# -c:跟命令# 锁文件位置# -w /var/lock/mytask.lock# 写法flock -n /var/lock/mytask.lock python3 /opt/mytask.py# 一次性定时echo"command" | at 14:30echo"command" | at now + 5 minutesecho"command" | at 2026-06-15# 看队列atq# 删atrm <job-id>更现代的定时方式:
# /etc/systemd/system/backup.timer[Unit]Description=Daily Backup[Timer]OnCalendar=dailyOnCalendar=Mon..Fri 02:00Persistent=true[Install]WantedBy=timers.target# /etc/systemd/system/backup.service[Unit]Description=Backup[Service]ExecStart=/opt/backup.shsystemctl daemon-reloadsystemctl enable --now backup.timersystemctl list-timersyum install -y strace# 跟踪进程strace -p <pid># 跟踪新进程strace command# 看系统调用strace -p <pid> -e trace=network# -e trace=network:只看网络相关# -e trace=open,read,write:看文件操作# -e trace=memory:内存相关# 统计系统调用strace -p <pid> -c# 看时间strace -p <pid> -t# 输出到文件strace -p <pid> -o /tmp/strace.log风险提示:strace 在生产慎用,会让进程变慢,且高并发场景下日志会爆。
yum install -y ltrace# 跟踪库调用ltrace -p <pid># 跟指定库ltrace -p <pid> -l "libssl*"见 4.5。
# 装(需要 kernel-devel)yum install -y bcc-tools# 工具位置ls /usr/share/bcc/tools/# biolatency tcpconnect opensnoop ...# biolatency:块设备 IO 延迟/usr/share/bcc/tools/biolatency 1 10# 输出 latency 分布# tcpconnect:实时 TCP 连接/usr/share/bcc/tools/tcpconnect# 看谁在连谁# opensnoop:跟踪 open 系统调用/usr/share/bcc/tools/opensnoop# 看哪些文件被打开# execsnoop:跟踪 exec/usr/share/bcc/tools/execsnoop# 看哪些进程被启动# capable:跟踪 capability 检查/usr/share/bcc/tools/capableyum install -y bpftrace# 简单 one-linerbpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'# 看进程执行的命令bpftrace -e 'tracepoint:syscalls:sys_enter_execve { printf("%s -> %s\n", comm, str(args->filename)); }'风险提示:bcc / bpftrace 在生产慎用,可能导致性能波动。
# 把 stdin 转成命令参数echo"a b c" | xargs -n 1 echo# a# b# c# -n 1:每次传 1 个参数# 删 .log 文件find . -name "*.log" | xargs rm# 用 -I 替换find . -name "*.log" | xargs -I {} mv {} /backup/# 限制并发find . -name "*.txt" | xargs -P 4 -I {} cp {} /dst/# -P 4:4 个并发# 排序sort file# 数字排序sort -n file# 倒序sort -rn file# 按列sort -k 2 file# 按第 2 列# 去重sort -u file# human-readable 排序sort -h file# 1K, 2M, 3G# 去重(要求已排序)sort file | uniq# 计数sort file | uniq -c | sort -rn# 出现次数排行# 看重复sort file | uniq -d# 看非重复sort file | uniq -u# 按列cut -d: -f1 /etc/passwd# -d:分隔符# -f:取第几列# 按字符cut -c1-10 file# 取每行 1-10 字符# 替换echo"hello" | tr 'a-z''A-Z'# HELLO# 删字符echo"hello 123" | tr -d '0-9'# hello# 压缩重复echo"hello world" | tr -s ' '# hello world# 对齐输出mount | column -t# 自定义分隔符cat /etc/passwd | column -t -s:# 合并两个文件paste file1 file2# 1行 file1 1行 file2 拼一起# 自定义分隔符paste -d'|' file1 file2# diffdiff file1 file2# 统一格式diff -u file1 file2# 生成 patch# commcomm file1 file2# 三列:只在 file1、只在 file2、共有# 抑制某列comm -23 file1 file2# 只看 file1 独有的comm -13 file1 file2# 只看 file2 独有的yum install -y tmux# 新建 sessiontmux new -s mysession# 分离# Ctrl+b d# 列 sessiontmux ls# 重新连接tmux attach -t mysession# 快捷键# Ctrl+b c:新建 window# Ctrl+b n / p:next / prev window# Ctrl+b ":水平分屏# Ctrl+b %:垂直分屏# Ctrl+b 方向键:切换 pane# Ctrl+b x:关闭 pane# Ctrl+b [:进入复制模式(PgUp/PgDn 翻页)# Ctrl+b ]:粘贴# Ctrl+b ?:帮助yum install -y screen# 新建screen -S mysession# 分离# Ctrl+a d# 列screen -ls# 重新连接screen -r mysessionyum install -y glancesglances# 综合监控# CPU / 内存 / 网络 / 磁盘 / 进程 / 传感器 / 文件系统# 支持 web 模式glances -w# 输出到文件glances --export csv --export-csv-file /tmp/glances.csvyum install -y dstat# 组合输出dstat -cdngym 1# c: cpu# d: disk# n: net# g: page# y: sys# m: mem# 高级dstat --top-cpu --top-io --top-mem 1# 下载wget http://sourceforge.net/projects/nmon/files/nmon16e_mpginc.tar.gztar xzf nmon16e_mpginc.tar.gzchmod +x nmon_x86_64_rhel7mv nmon_x86_64_rhel7 /usr/local/bin/nmon# 跑nmon# 进入交互# c:CPU# m:内存# d:磁盘# n:网络# t:top 进程# h:帮助# 录数据nmon -f -s 5 -c 60# -f:文件# -s 5:5 秒一次# -c 60:录 60 次 = 5 分钟# 输出 hostname_YYMMDD_HHMM.nmon 文件# 用 nmon analyser 打开(Windows 工具)sysstat 是一组工具的集合:
iostat:磁盘 IOmpstat:CPUpidstat:进程sar:系统活动sadc:数据收集器sa1 / sa2:cron 跑的脚本# 启用历史收集vim /etc/cron.d/sysstat# 取消这行注释# */5 * * * * root /usr/lib64/sa/sa1 1 1# 启用 sadcsystemctl enable sysstatsystemctl start sysstat# 看历史ls /var/log/sa/# sa13: 二进制# sar13: 文本sar -u -f /var/log/sa/sa13sar -d -f /var/log/sa/sa13sar -r -f /var/log/sa/sa13sar -n DEV -f /var/log/sa/sa13# 登录ssh user@host# 指定端口ssh -p 2222 user@host# 跑命令ssh user@host "ls /tmp"# 传文件scp file user@host:/tmp/# 免密登录ssh-keygen -t rsa -b 4096ssh-copy-id user@host# 跳板ssh -J user@jumphost user@dest# 端口转发# 本地转发ssh -L 8080:remote-host:80 user@host# 访问本地 8080 转到 remote-host:80# 远程转发ssh -R 8080:localhost:80 user@host# 远程访问 host:8080 转到本地 80# 动态转发(SOCKS 代理)ssh -D 1080 user@host# 本地 1080 起 SOCKS 代理vim ~/.ssh/config# Host prod-redis# HostName 10.20.0.11# User deploy# Port 22# IdentityFile ~/.ssh/id_rsa# 之后直接ssh prod-redis# 启动 agenteval $(ssh-agent)# 加 keyssh-add ~/.ssh/id_rsa# 看ssh-add -l# 锁ssh-add -x# 解锁ssh-add -X# 测连通ping 8.8.8.8# 限次ping -c 5 8.8.8.8# 限时间ping -w 10 8.8.8.8# IPv6ping6 ipv6.google.com# 简单查host example.com# example.com has address 93.184.216.34# digdig example.comdig example.com +shortdig @8.8.8.8 example.com# 指定 DNS# 反向dig -x 8.8.8.8# MX 记录dig example.com MX# 跟踪dig +trace example.com# nslookup(老的)nslookup example.com# 测端口telnet 10.20.0.10 80# 连上说明端口通# 风险提示:telnet 传明文,生产慎用# 替代用 ncnc -zv 10.20.0.10 80# 1. 看进程(CPU 高的)top -c# 找到 PID# 2. 看进程详情ps -p <pid> -o pid,ppid,user,stat,pcpu,pmem,vsz,rss,etime,cmd# 3. 看进程 IOpidstat -d -p <pid> 1# 4. 看进程打开的文件lsof -p <pid># 5. 看进程系统调用strace -p <pid> -c# 统计strace -p <pid># 实时# 6. 看进程内存pmap -x <pid># 7. 看进程网络连接ss -tnp | grep <pid># 8. 看应用日志tail -F /var/log/app.log# 1. 看端口ss -tlnp | grep 80# LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6))# 2. 看进程lsof -i :80# 3. 找到 PID 后看进程ps -p 1234 -o cmd# 4. 找到配置文件ls -l /proc/1234/cwd# 进程工作目录# 1. 看磁盘df -h# 找满的盘# 2. 看大目录du -sh /* 2>/dev/null | sort -h | tail# 3. 看大目录的子目录du -sh /var/* | sort -h | tail# 4. 看具体大文件find / -type f -size +1G 2>/dev/null -exec ls -lh {} \;find / -type f -size +100M 2>/dev/null -exec du -h {} \;# 5. 排序find / -type f -size +100M 2>/dev/null -exec du -h {} \; | sort -h | tail -20# 1. toptop -c# 找 %CPU 高的# 2. psps aux --sort=-%cpu | head# 3. pidstatpidstat -u 1# 4. 找到进程后看堆栈jstack <pid> # Java# 或strace -p <pid> -c# 统计# 5. 看调用栈perf top -p <pid> -g# 总连接数ss -s# 各状态ss -tan | awk 'NR>1{print $1}' | sort | uniq -c# 某 IP 的连接ss -tan | grep 10.20.0.10 | wc -l# 哪 IP 最多连接ss -tan | awk 'NR>1{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head# 哪端口被连接最多ss -tan | awk 'NR>1{print $4}' | cut -d: -f2 | sort | uniq -c | sort -rn | head# ESTABLISHED 状态ss -tan state established | wc -l# 1. 看连通ping -c 100 host# 看延迟 / 丢包# 2. 路由追踪mtr -r -c 100 host# 3. TCP 重传sar -n TCP,ETCP 1# 看 retrans/s# 4. 网卡丢包ifconfig eth0# 看 RX/TX dropped# 5. 网卡 ring bufferethtool -g eth0# 6. 网卡统计ethtool -S eth0 | grep -i drop# 1. 看 toptop -c# 2. 看进程ps -eo pid,pcpu,pmem,cmd --sort=-pcpu | head# 3. 看进程线程top -H -p <pid># 找到线程# 4. 线程转 16 进制printf"%x\n" <tid># 1a1b# 5. 看 jstackjstack <pid> | grep -A 30 "1a1b"# Java# 6. 看 perfperf top -p <pid> -g# C/C++ / Go# 7. 看系统调用strace -p <pid> -c# 1. 看 freefree -h# 2. 看 processps aux --sort=-%mem | head# 3. 看进程内存变化whiletrue; do ps -p <pid> -o rss,vsz sleep 5done# 4. pmap 看哪段大pmap -x <pid> | sort -k2 -nr | head# 5. Java 用 jmap / jstatjmap -heap <pid>jstat -gc <pid> 1s# 6. valgrind(开发用)valgrind --leak-check=full ./app# 1. 看启动耗时systemd-analyze# 2. 看哪个服务慢systemd-analyze blame# 3. 看关键路径systemd-analyze critical-chain# 4. 看启动日志journalctl -b# 上次启动失败的原因下面是生产绝对不要用或者要非常小心的命令。每条都是真实的事故。
rm -rf /# 删根目录# 真实事故:脚本里没传路径,默认 . → 反复递归 → 系统全废rm -rf /* > /dev/null# 删根目录所有文件rm -rf $VAR/*# VAR 没定义 → rm -rf /*# 安全做法# 1. 用 trash-cliyum install -y trash-clitrash-put file# 软删除# 2. 删除前确认ls $VAR/rm -rf $VAR/*# 看到 ls 输出再删# 3. 限制 rm 范围rm -rf /data/cache/*# 先确认 /data/cache 存在且不是 /dd if=/dev/zero of=/dev/sda# 清空整块磁盘# 真实事故:# if=/dev/zero of=/dev/sdb bs=1M# 本来想写 sdb1(sdb 的第一个分区)# 错写成 sdb(整块盘)# 数据全废# 安全做法# 1. lsblk 看盘lsblk# 2. 确认盘符fdisk -l /dev/sdb# 3. 写到具体分区dd if=/dev/zero of=/dev/sdb1 bs=1M count=100# count=100 限制大小# 4. 加 conv=sync 跳过错误dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 conv=syncchmod -R 777 /# 全部文件 777,安全灾难# 真实事故:# 一个新人 root 上 chmod -R 777 /var/www# 整个 web 目录全 777# 等于给攻击者开了后门# 安全做法# 1. 限制目录chmod -R 755 /var/www/html# 2. 文件 vs 目录分开处理find /var/www -type f -exec chmod 644 {} \;find /var/www -type d -exec chmod 755 {} \;# 3. 永远不要用 777kill -9 mysqld# 数据库可能丢数据# 真实事故:# kill -9 mysqld# 之后数据库启动不起来# 因为 redo log 没刷盘,崩溃恢复失败# 安全做法# 1. 先 kill 15kill <pid># 给 30 秒清理# 2. kill 9 之前先 SHUTDOWNmysql -e "SHUTDOWN"# MySQL 自己的清理# 3. 看进程响应kill -0 <pid># 不真杀,只检测> /etc/passwd# 清空 /etc/passwd# 真实事故:# echo "xxx" > /etc/sudoers # 报错 Permission denied# > /etc/environment # 错写成 /etc/passwd# 机器上所有用户进不来# 安全做法# 1. 用 >> 而不是 > (追加)echo"xxx" >> /etc/environment# 2. 改前 cpcp /etc/passwd /etc/passwd.bak# 3. 用 vim 编辑而不是重定向vim /etc/passwdhistory -c# 抹操作记录# 真实事故:# 事故后 history -c# 调查时不知道谁干了什么# 失去追责依据# 安全做法# 1. 不要用 history -c# 2. 保留 history 给 audit# 3. 把 history 写到统一日志服务器mkfs.ext4 /dev/sda# 格式化整块盘,不是分区# 数据全废# 安全做法# 1. mkfs 之前先确认盘lsblkfdisk -l /dev/sda# 2. 加 -f 前确认mkfs.ext4 /dev/sda1# 写具体分区,不是 sdafdisk /dev/sdb# 然后 w 写错# 分区表破坏# 安全做法# 1. 改前备份分区表sfdisk -d /dev/sda > /tmp/sda-part.bak# 2. 重要盘先 umountumount /data# 3. 操作前看多一遍 fdisk -l# 看历史history# 跑历史的某条!1234# 找命令history | grep "rm -rf"# 时间戳export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "# 之后 history 显示时间# 写到统一文件export HISTFILE=/var/log/bash_history/$(whoami)_$(date +%Y%m).logyum install -y auditd# 看规则auditctl -l# 加规则:监控 /etc/passwd 修改auditctl -w /etc/passwd -p wa -k passwd_changes# 触发后看ausearch -k passwd_changes# 永久规则vim /etc/audit/rules.d/audit.rules-w /etc/passwd -p wa -k passwd_changes-w /etc/shadow -p wa -k shadow_changes-w /etc/sudoers -p wa -k sudoers_changescat /var/log/secure# CentOS / RHELcat /var/log/auth.log# Ubuntu / Debian# 看 sudo 行为grep sudo /var/log/secure# bash 快捷键Ctrl + A # 行首Ctrl + E # 行尾Ctrl + U # 删到行首Ctrl + K # 删到行尾Ctrl + W # 删一个词Ctrl + R # 反向搜索历史Ctrl + L # 清屏Ctrl + C # 中断Ctrl + D # 退出Ctrl + Z # 暂停# 翻命令↑ / ↓ # 历史# Tab # 补全# ! # 执行历史!! # 上条!$ # 上条最后一个参数!* # 上条所有参数!123 # 历史第 123 条# ~/.bashrcalias ll='ls -lh'alias la='ls -lah'alias l='ls -CF'alias rm='rm -i'alias cp='cp -i'alias mv='mv -i'# -i:覆盖前确认# 注意:rm -i 是个双刃剑,脚本里 rm 会被卡alias h='history'alias psg='ps -ef | grep'alias ports='ss -tlnp'alias myip='curl -s ifconfig.me'alias reload='source ~/.bashrc'# 服务器组alias prod='ssh user@prod-01'alias stage='ssh user@stage-01'# 危险命令再确认alias rm='echo "Use trash-put instead"'# 找大文件bigfiles() { find / -type f -size +${1:-100M} 2>/dev/null | xargs du -h 2>/dev/null | sort -h | tail -${2:-20}}bigfiles 1G 10# 杀进程kp() { ps -ef | grep "$1" | grep -v grepecho -n "Kill? [y/N]: "read answerif [ "$answer" = "y" ]; then pkill "$1"fi}# 快速 SSHsshhost() { ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null $@}# ~/.bashrcPS1='\u@\h:\w\$ '# user@host:cwd$# 带颜色PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '# 显示 git 分支parse_git_branch() { git branch 2>/dev/null | grep '*' | sed 's/* //'}PS1='\u@\h:\w(\$(parse_git_branch))\$ 'find / -type f -empty# 删空文件find /tmp -type f -empty -delete# 全部 .txt 改成 .mdfor f in *.txt; do mv "$f""${f%.txt}.md"done# 用 renamerename 's/\.txt$/.md/' *.txtgit status --porcelain | awk '{print $2}' | xargs -I {} ls -lh {}# 一台ssh user@host "ls /tmp"# 多台for host in prod-01 prod-02 prod-03; doecho"=== $host ===" ssh user@$host"uptime"done# 用 psshpssh -h hosts.txt -i "uptime"# hosts.txt 一行一个 host# 用 ansibleansible all -i hosts -m shell -a "uptime"# 批量改权限find /data -type d -exec chmod 755 {} \;find /data -type f -exec chmod 644 {} \;# 批量打包find /data -name "*.log" -exec tar -czf logs.tar.gz {} +# 批量传find /data -name "*.log" | xargs -I {} scp {} user@backup:/backup/# 一行查系统版本cat /etc/os-release# NAME="CentOS Linux"# VERSION="7 (Core)"# ID="centos"# ID_LIKE="rhel fedora"# Ubuntulsb_release -a# No LSB modules are available.# Distributor ID: Ubuntu# Description: Ubuntu 22.04.3 LTS# Release: 22.04# Codename: jammy# 内核uname -a# CPUlscpu | head# 内存free -h# 磁盘df -h# 网络ip a# 启动时长uptime# 整体hostnamectl# 看命令耗时time ls# real 0m0.001s# user 0m0.000s# sys 0m0.001s# 详细/usr/bin/time -v ls# User time (seconds): 0.00# System time (seconds): 0.00# Percent of CPU this job got: 0%# Elapsed (wall clock) time: 0:00.00# ...# 命令超时timeout 10 ping 8.8.8.8# 10 秒后自动停# 跑慢命令timeout 600 long_running_command# 超时后发信号timeout --signal=9 10 ping 8.8.8.8# 超时后 SIGKILL# 基本rsync -av /src/ /dst/# 远程rsync -av /src/ user@host:/dst/# 走 SSH 选项rsync -av -e "ssh -p 2222" /src/ user@host:/dst/# 排除rsync -av --exclude='*.log' --exclude='cache/' /src/ /dst/# 排除文件rsync -av --exclude-from='exclude.txt' /src/ /dst/# exclude.txt 一行一个模式# 限速rsync -av --bwlimit=10m /src/ user@host:/dst/# 断点续传rsync -avP /src/ user@host:/dst/# -P:--partial --progress# 同步删除rsync -av --delete /src/ /dst/# dry-runrsync -avn --delete /src/ /dst/# 压缩rsync -avz /src/ /dst/# 保留硬链rsync -avH /src/ /dst/# -H:硬链# 基础scp file user@host:/dst/# 目录scp -r dir user@host:/dst/# 限速scp -l 1000 file user@host:/dst/# 1000 Kbit/s# 走 keyscp -i ~/.ssh/key file user@host:/dst/# 保留权限scp -p file user@host:/dst/# 看fdisk -l# 改fdisk /dev/sda# m 帮助# p 打印# n 新建# d 删# t 改类型# w 写# q 不保存退出# 看parted /dev/sda print# 改parted /dev/sda mklabel gptparted /dev/sda mkpart primary xfs 0% 100%# 删parted /dev/sda rm 1# 改大小parted /dev/sda resizepart 1 200GiB# ext4mkfs.ext4 /dev/sda1# xfsmkfs.xfs /dev/sda1 -L data -f# btrfsmkfs.btrfs /dev/sda1# 加参数mkfs.ext4 -L data -m 1 /dev/sda1# -m 1:保留块 1%# -L:卷标# 临时挂载mount /dev/sda1 /data# 写 fstabblkid /dev/sda1# 拿 UUIDecho"UUID=xxx /data xfs defaults,noatime 0 0" >> /etc/fstab# 验证mount -a# 重新挂载mount -o remount,rw /data# PVpvcreate /dev/sdbpvspvdisplay# VGvgcreate data-vg /dev/sdbvgextend data-vg /dev/sddvgsvgdisplay# LVlvcreate -L 100G -n data-lv data-vglvextend -l +100%FREE /dev/data-vg/data-lvlvreduce -L 100G /dev/data-vg/data-lv# 缩 LV 高危lvslvdisplay# 扩 FSxfs_growfs /dataresize2fs /dev/data-vg/data-lvwc -l file# 行数wc -w file# 词数wc -c file# 字节数wc -m file# 字符数head -n 10 file# 前 10 行tail -n 10 file# 后 10 行tail -F file# 实时跟踪# 按行数拆split -l 1000 file prefix_# 每个 1000 行# 按大小拆split -b 100m file prefix_# 按行数拆带后缀split -l 1000 -d -a 3 file prefix_# prefix_000, prefix_001, ...# 加行号nl file# 空行不加nl -ba filedatedate +%F# 2026-06-13date +%T# 14:30:00date +"%F %T"# 2026-06-13 14:30:00cal# 当月日历cal 6 2026# 2026 年 6 月echo"hello"echo -e "a\tb"# -e:解释转义echo"$var"printf"%s\n""hello"printf"%d %s\n" 123 "abc"# 格式化输出yes | command# 自动回答 yyes "no" | command# 回答 noseq 1 10# 1 2 3 ... 10seq 1 2 10# 1 3 5 7 9# 步长 2# 配合seq 1 10 | xargs -I {} echo"task {}"# 计算器echo"1+1" | bc# 2echo"scale=2; 10/3" | bc# 3.33# 每秒跑一次watch -n 1 "ls -lh /tmp"# 默认 2 秒# 高亮变化watch -d -n 1 "free -h"# 帮助man ls# 查命令man -k network# 模糊查询# 章节man 5 passwd# 1 命令# 2 系统调用# 3 库函数# 4 设备# 5 配置文件# 6 游戏# 7 其他# 8 系统管理命令# 系统uname -a, hostname, uptime, date, who, w, last# 进程ps aux, top, htop, kill, pkill, pgrep, pidof, pstree# CPUtop, mpstat, sar -u, lscpu, perf top# 内存free, vmstat, sar -r, slabtop, pmap# 网络ip, ss, netstat, ping, mtr, traceroute, tcpdump, iftop, nethogs, curl, wget, nc, ethtool# 磁盘df, du, lsblk, blkid, mount, fdisk, parted, iostat, iotop, fuser, lsof# 文件find, locate, stat, file, tree, ls, ln, chmod, chown, rsync, scp, tar, zip, dd# 日志tail, head, less, grep, awk, sed, journalctl, dmesg, logrotate# 用户useradd, usermod, userdel, passwd, chage, groupadd, id, su, sudo# 服务systemctl, journalctl, systemd-analyze# 包yum, dnf, apt-get, rpm, dpkg# 定时crontab, at, flock, systemd-timer# 性能strace, ltrace, perf, bcc, bpftrace# 工具tmux, screen, glances, dstat, nmon文章到这里就结束了。命令这一块,没别的捷径,就是天天用、用熟。但更重要的不是"会用",而是"知道什么时候用、什么时候不用、用了风险是什么"。生产里 rm -rf 出事的,十有八九是"知道这命令、不知道后果"。
把这篇存一份到本地或者收藏夹,日常忘了就翻一下,比搜索引擎更准。
文末福利
网络监控是保障网络系统和数据安全的重要手段,能够帮助运维人员及时发现并应对各种问题,及时发现并解决,从而确保网络的顺畅运行。
谢谢一路支持,给大家分享6款开源免费的网络监控工具,并准备了对应的资料文档,建议运维工程师收藏(文末一键领取)。


100%免费领取


内容较多,6款常用网络监控工具(zabbix、Prometheus、Cacti、Grafana、OpenNMS、Nagios)不再一一介绍, 需要的朋友扫码备注【监控合集】,即可100%免费领取。

以上所有资料获取请扫码

100%免费领取
(后台不再回复,扫码一键领取)