作为一名Linux系统管理员,掌握高效的实用操作技巧是日常工作的基本功。不同于基础命令学习阶段,实用操作更注重解决实际问题时的效率与可靠性。本文将分享我在生产环境中总结的Linux实用操作经验,涵盖文件处理、系统监控、网络调试等核心场景。
处理日志文件时经常需要批量操作,这是几个实用组合命令:
bash复制# 批量重命名日志文件(添加日期后缀)
for file in *.log; do mv "$file" "${file%.log}_$(date +%Y%m%d).log"; done
# 快速统计目录下各类文件数量
find . -type f | awk -F. '{print $NF}' | sort | uniq -c | sort -nr
注意:批量操作前建议先用
echo测试命令效果,避免误操作
grep进阶用法:
bash复制# 显示匹配行及前后3行内容
grep -A3 -B3 "error" system.log
# 统计不同错误类型出现次数
grep -oP 'error:\s*\K\w+' app.log | sort | uniq -c
sed实战案例:
bash复制# 替换配置文件中的IP地址(保留原文件备份)
sed -i.bak 's/192.168.1.100/10.0.0.50/g' config.ini
# 提取nginx日志中特定时间段记录
sed -n '/25\/May\/2023:10:00/,/25\/May\/2023:12:00/p' access.log
awk数据分析:
bash复制# 计算CSV文件第二列平均值
awk -F, 'NR>1 {sum+=$2; count++} END {print sum/count}' data.csv
# 格式化显示进程内存占用(MB)
ps aux | awk '{printf "%-10s %-10s %-10s\n", $1, $2, $6/1024"M"}'
bash复制# 综合监控仪表板(需安装htop)
htop -d 10 # 10秒刷新间隔
# 磁盘I/O监控
iostat -xmt 2 # 每2秒显示扩展指标
# 网络流量监控
nload -u M eth0 # 以MB为单位显示eth0流量
当系统响应变慢时,我通常按以下顺序排查:
CPU瓶颈:
bash复制top -H -p $(pgrep nginx) # 查看特定进程线程CPU占用
perf top -p $(pidof java) # Java程序热点分析
内存问题:
bash复制free -h # 整体内存状态
pmap -x $(pidof redis) # 进程详细内存映射
磁盘I/O:
bash复制iotop -oP # 显示实际I/O进程
dstat -td --disk-util # 磁盘利用率统计
bash复制# 快速TCP端口测试
nc -zv example.com 80-90 2>&1 | grep succeeded
# 路由追踪(mtr比traceroute更详细)
mtr -rwbzc 50 google.com
生产环境SSH安全建议:
修改默认端口:
bash复制Port 58222 # /etc/ssh/sshd_config
禁止root登录:
bash复制PermitRootLogin no
密钥认证配置:
bash复制ssh-keygen -t ed25519 -C "work@server"
ssh-copy-id -p 58222 user@host
bash复制# 查看所有用户crontab
for user in $(cut -f1 -d: /etc/passwd); do crontab -u $user -l; done
# 日志轮转配置示例(/etc/logrotate.d/nginx)
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
systemctl reload nginx
endscript
}
新服务器部署时我会运行的初始化脚本片段:
bash复制#!/bin/bash
# 时区配置
timedatectl set-timezone Asia/Shanghai
# 禁用不必要服务
systemctl disable --now postfix.service
# 内核参数优化
echo "net.ipv4.tcp_tw_reuse = 1" >> /etc/sysctl.conf
sysctl -p
# 配置EPEL仓库(CentOS)
yum install -y epel-release
当收到磁盘空间报警时,我的排查流程:
快速定位大文件:
bash复制du -h --max-depth=1 / | sort -h
检查可能的空间占用:
bash复制# 查找超过100MB的日志文件
find /var/log -type f -size +100M -exec ls -lh {} \;
# 检查docker磁盘占用
docker system df -v
处理方案:
bash复制# 日志文件截断(不重启服务)
: > /var/log/huge.log
# 清理旧版本docker镜像
docker image prune -a --filter "until=240h"
当systemd服务启动失败时,按顺序检查:
bash复制# 查看详细日志
journalctl -u nginx -xe --no-pager
# 检查依赖项
systemctl list-dependencies nginx.service
# 测试配置文件
nginx -t # 对于nginx服务
apachectl configtest # 对于apache
| 快捷键 | 功能描述 |
|---|---|
| Ctrl + R | 反向搜索命令历史 |
| Ctrl + A/E | 移动到行首/行尾 |
| Alt + B/F | 按单词前后移动 |
| Ctrl + U/K | 删除到行首/行尾 |
| Ctrl + W | 删除前一个单词 |
tmux终端复用:
bash复制# 基础会话管理
tmux new -s work
tmux attach -t work
fzf模糊查找:
bash复制# 交互式文件选择
vim $(fzf)
# 历史命令搜索
history | fzf
jq处理JSON:
bash复制curl -s api.example.com/data | jq '.items[] | select(.value > 100)'
bash复制# 审计具有sudo权限的用户
grep -Po '^sudo.+:\K.*$' /etc/group
# 设置关键目录权限
chmod 750 /home/*
chmod 700 /etc/ssh/ssh_host_*_key
bash复制# 基本规则设置(UFW)
ufw default deny incoming
ufw allow 58222/tcp # SSH自定义端口
ufw allow 80/tcp
ufw enable
# 复杂规则(iptables示例)
iptables -A INPUT -p tcp --dport 3306 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
bash复制# 数据库每日备份(MySQL示例)
mysqldump -u root -p --all-databases | gzip > /backup/mysql_$(date +%Y%m%d).sql.gz
# 增量备份脚本
rsync -avz --delete --link-dest=/backup/prev /data/ /backup/current
bash复制# 测试备份文件完整性
gzip -t /backup/mysql_20230601.sql.gz
# 验证备份内容
zcat /backup/mysql_20230601.sql.gz | head -n 50
bash复制# 清理无用容器
docker container prune -f
# 查看容器资源占用
docker stats --no-stream
# 容器内故障诊断
docker exec -it webapp /bin/bash
bash复制# 查看最近100行日志
docker logs --tail 100 webapp
# 日志实时监控
docker logs -f --since 10m webapp
# 日志文件轮转配置(daemon.json)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
bash复制# 高并发服务器建议配置(/etc/sysctl.conf)
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 8192
net.ipv4.tcp_tw_reuse = 1
vm.swappiness = 10
Nginx工作进程配置示例:
nginx复制worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
bash复制#!/bin/bash
echo "===== System Info ====="
echo "Hostname: $(hostname)"
echo "Uptime: $(uptime)"
echo "Load: $(cat /proc/loadavg)"
echo "Memory: $(free -h | awk '/Mem/{print $3"/"$2}')"
echo "Disk: $(df -h / | awk 'NR==2{print $3"/"$2}')"
bash复制#!/bin/bash
for user in dev1 dev2 test1 test2; do
useradd -m -s /bin/bash $user
echo "$user:$(openssl rand -base64 12)" | chpasswd
chage -d 0 $user # 强制首次登录修改密码
done
bash复制# 历史命令增强
export HISTSIZE=10000
export HISTFILESIZE=20000
export HISTTIMEFORMAT="%F %T "
shopt -s histappend
# 彩色提示符
PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '
# 常用别名
alias ll='ls -alFh --color=auto'
alias grep='grep --color=auto'
alias df='df -h'
alias du='du -h'
bash复制# 快速目录跳转
export CDPATH=.:~:/var/www:/etc
# 命令自动修正
shopt -s cdspell
shopt -s dirspell
bash复制# 统计各小时错误数(跨多个日志文件)
grep "ERROR" /var/log/app/*.log | awk '{print $2}' | cut -d: -f1 | sort | uniq -c
# 追踪请求链路(跨Nginx和App日志)
grep "X-Trace-ID=abc123" /var/log/nginx/access.log /var/log/app/app.log
bash复制# 多文件实时监控
multitail -cS apache /var/log/apache2/access.log -cS error /var/log/apache2/error.log
# 带过滤的日志跟踪
tail -f /var/log/nginx/access.log | grep -v "ELB-HealthChecker"
bash复制# CPU信息
lscpu | grep -E 'Model name|Socket|Thread|Core'
# 内存详情
dmidecode -t memory | grep -E 'Size|Type|Speed'
# 磁盘健康状态
smartctl -a /dev/sda | grep -E 'Model|Capacity|Temperature|Reallocated_Sector_Ct'
bash复制lspci -tv # 树状视图
lspci -nnk # 显示驱动信息
lsusb -v # USB设备详情
bash复制# Ubuntu/Debian
apt list --upgradable 2>/dev/null | grep -v "^Listing" | cut -d/ -f1 | xargs sudo apt install -y
# CentOS/RHEL
yum list updates | awk '{print $1}' | grep -v "^Loaded" | xargs sudo yum update -y
bash复制# 查看依赖树
apt-cache depends nginx
yum deplist httpd
# 查找文件所属包
dpkg -S /usr/bin/curl # Debian
rpm -qf /bin/ls # RHEL
bash复制# 全局配置(/etc/environment)
JAVA_HOME="/usr/lib/jvm/java-11-openjdk"
PATH="$PATH:/opt/bin"
# 用户级配置(~/.bashrc)
export EDITOR=vim
export HISTCONTROL=ignoreboth
bash复制# 单命令环境变量
http_proxy=http://proxy.example.com:8080 curl https://example.com
# 子shell环境
(export DEBUG=1; ./script.sh)
bash复制# 按CPU排序
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head
# 查看进程打开文件
lsof -p $(pidof nginx)
# 进程树查看
pstree -apnh $(pidof java)
bash复制# 优雅停止进程
kill -TERM $(pidof worker)
# 强制终止(最后手段)
kill -KILL $(pidof zombie)
# 重新加载配置
kill -HUP $(pidof nginx)
bash复制# 检查同步状态
chronyc tracking
chronyc sources -v
# 强制立即同步
chronyc makestep
bash复制# 交互式选择时区
timedatectl list-timezones | grep -i asia
sudo timedatectl set-timezone Asia/Shanghai
# 硬件时钟同步
hwclock --systohc
bash复制# 分析启动耗时
systemd-analyze blame
systemd-analyze critical-chain
# 禁用不必要的服务
systemctl disable NetworkManager-wait-online.service
bash复制journalctl -b # 本次启动日志
journalctl -b -1 # 上次启动日志
dmesg | grep -i error # 内核启动消息
bash复制# 查看当前挂载参数
mount | grep /data
# 高性能挂载选项(/etc/fstab)
UUID=xxxx /data xfs defaults,noatime,nodiratime 0 0
bash复制# 强制检查(下次启动时)
touch /forcefsck
# 手动检查(卸载状态)
fsck -y /dev/sdb1
bash复制# 监控关键文件修改
-a always,exit -F path=/etc/passwd -F perm=wa -k identity
# 记录sudo使用
-a always,exit -S execve -F path=/usr/bin/sudo -F key=sudo
bash复制ausearch -k identity -i # 按key搜索
aureport -f -i # 文件访问报告
bash复制# 列出已加载模块
lsmod
# 查看模块信息
modinfo nf_conntrack
# 临时加载模块
modprobe nf_conntrack
bash复制# 查看当前参数
systctl -a | grep nf_conntrack
# 持久化配置(/etc/sysctl.d/)
net.nf_conntrack_max = 655360
singlebash复制# 挂载根目录可写
mount -o remount,rw /
# 修改密码
passwd root
# 重建SELinux上下文
touch /.autorelabel
bash复制# 查看虚拟机列表
virsh list --all
# 启动虚拟机
virsh start centos7
# 控制台连接
virsh console ubuntu
bash复制virt-clone --original vm1 --name vm2 --file /var/lib/libvirt/images/vm2.qcow2
bash复制# 顺序读写(1GB文件)
fio --name=seqread --rw=read --size=1G --filename=/tmp/test
# 随机IO
fio --name=randrw --rw=randrw --size=1G --runtime=60 --filename=/tmp/test
bash复制# 服务端
iperf3 -s
# 客户端
iperf3 -c server_ip -t 30 -P 4
bash复制# 自定义日志轮转(/etc/logrotate.d/custom)
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 640 root adm
postrotate
systemctl reload myapp
endscript
}
bash复制logrotate -vf /etc/logrotate.d/nginx
bash复制# 创建基本环境
mkdir -p /chroot/{bin,lib,lib64}
cp /bin/{bash,ls} /chroot/bin/
ldd /bin/bash | awk '/=>/ {print $3}' | xargs -I {} cp {} /chroot/lib/
bash复制# 创建网络命名空间
ip netns add testns
ip netns exec testns bash
bash复制# 使用dd物理备份(需live CD环境)
dd if=/dev/sda of=/backup/sda.img bs=4M status=progress
# 使用tar增量备份
tar --listed-incremental=/backup/snapshot.file -czpf /backup/incr_$(date +%Y%m%d).tar.gz /data
bash复制# 备份重要目录
rsync -avz /etc /backup/etc_$(date +%Y%m%d)
bash复制# 会话管理
tmux new -s project
tmux attach -t project
# 窗格操作(前缀键通常为Ctrl+b)
% # 垂直分割
" # 水平分割
方向键切换窗格
bash复制screen -S session_name # 新建会话
Ctrl+a d # 分离会话
screen -r session_name # 恢复会话
bash复制# Ubuntu LTS升级
do-release-upgrade
# CentOS版本升级
yum install preupgrade-assistant-contents
preupg
bash复制# 查看可用内核
yum list kernel --showduplicates
# 安全升级
yum update --security
bash复制# CentOS最小安装
yum groupinstall "Minimal Install"
# Ubuntu服务器版
tasksel install server
bash复制# 查看所有服务
systemctl list-unit-files --type=service
# 禁用不必要的服务
systemctl mask bluetooth.service
bash复制# 本地端口转发(访问远程内网)
ssh -L 8080:internal_host:80 jump_host
# 动态SOCKS代理
ssh -D 1080 user@server
bash复制# 使用pssh批量操作
pssh -h hosts.txt -l user -i "uptime"
# 并行rsync传输
parallel-rsync -h hosts.txt -l user -r src_dir/ dest_dir/
bash复制# 跟踪系统调用
strace -f -o debug.log ./script.sh
# 统计调用耗时
strace -c -p $(pidof nginx)
bash复制# 检测内存泄漏
valgrind --leak-check=yes ./program
# 分析core dump
gdb -c core.file ./program
bash复制# 接收方
nc -l 1234 > file.tar
# 发送方
nc receiver_ip 1234 < file.tar
bash复制# 开始录制
script -t 2> timing.log -a session.log
# 回放记录
scriptreplay timing.log session.log
bash复制# 使用lynis扫描
lynis audit system
# 检查rootkit
rkhunter --check
bash复制# 使用OpenSCAP
oscap xccdf eval --profile standard --results scan.xml /usr/share/xml/scap/ssg/content/ssg-centos7-ds.xml
bash复制# 检查失败登录
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr
# 统计成功登录
last -ai | head -20
bash复制# 使用logwatch生成日报
logwatch --range yesterday --detail high
bash复制# CPU温度
sensors | grep Core
# 磁盘温度
hddtemp /dev/sd?
bash复制# 检查硬盘健康
smartctl -H /dev/sda
# 查看详细属性
smartctl -A /dev/sda
bash复制# 查看当前限制
ulimit -a
# 永久修改(/etc/security/limits.conf)
* soft nofile 65535
* hard nofile 65535
bash复制# 创建控制组
cgcreate -g cpu,memory:/mygroup
# 限制CPU使用
cgset -r cpu.cfs_quota_us=50000 mygroup
bash复制# 安装chrony
yum install chrony
# 配置NTP服务器(/etc/chrony.conf)
server ntp.example.com iburst
bash复制# Unix时间戳转日期
date -d @1625097600
# 日期转时间戳
date -d "2021-06-30" +%s
bash复制# 查看可用locale
locale -a
# 生成新locale
localedef -i en_US -f UTF-8 en_US.UTF-8
bash复制# 单命令语言设置
LANG=zh_CN.UTF-8 ls
# 会话级设置
export LANG=ja_JP.UTF-8
bash复制# LVM快照创建
lvcreate -L 10G -s -n root_snap /dev/vg00/root
# 恢复快照
lvconvert --merge /dev/vg00/root_snap
bash复制# 使用Clonezilla
clonezilla -s -g auto -e1 auto -e2 -r -j2 -p true restoredisk sda image.zip
bash复制# 使用sysbench
sysbench cpu --cpu-max-prime=20000 run
# 多核测试
sysbench cpu --threads=8 run
bash复制sysbench memory --memory-block-size=1K --memory-total-size=10G run
bash复制# 安装fail2ban
yum install fail2ban
# 配置(/etc/fail2ban/jail.local)
[sshd]
enabled = true
maxretry = 3
bash复制# 使用aide
aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
aide --check
bash复制# 替代docker命令
alias docker=podman
# rootless容器
podman run -d --name web -p 8080:80 nginx
bash复制# 创建自定义网络
podman network create mynet
# 连接容器
podman run --network=mynet --name app1 myimage
bash复制# 查看依赖库
ldd /usr/bin/curl
# 设置库路径
LD_LIBRARY_PATH=/opt/lib ./program
bash复制# 查看内核消息
dmesg -T
# 跟踪系统调用
perf trace -p $(pidof nginx)
bash复制# 使用glances
glances --disable-plugin docker,ports
# 使用netdata
systemctl start netdata
bash复制# 使用sar收集数据
sar -u -r -n DEV 1 60
# 查看历史数据
sar -f /var/log/sa/sa10
bash复制# 配置rsyslog转发(/etc/rsyslog.conf)
*.* @logserver:514
bash复制# 按日期归档
find /var/log -name "*.log" -mtime +7 -exec gzip {} \;
# 清理旧日志
find /var/log -name "*.gz" -mtime +30 -delete
bash复制# 系统级定时任务(/etc/crontab)
0 3 * * * root /usr/sbin/logrotate /etc/logrotate.conf
bash复制# 使用incron监控目录
/var/www IN_MODIFY /opt/scripts/deploy.sh
在实际运维工作中,我发现以下几个经验特别有价值:
文档化一切:即使是简单的操作也要记录步骤和参数,三个月后你会感谢自己。我习惯用Markdown文件配合Git管理运维文档。
变更前备份:修改关键配置前,先用cp config.conf{,.bak}创建备份,这个习惯多次拯救了我的系统。
理解原理:比起死记硬背命令,理解每个参数的作用和底层机制更重要。比如明白rsync --delete的实际效果可以避免数据丢失。
测试环境验证:任何可能影响生产的操作先在测试环境验证,我维护了一个与生产环境相似的虚拟机专门用于测试。
监控先行:在部署新服务前先配置好监控,这样问题出现时你就能第一时间发现而不是等用户报告。
自动化重复工作:任何需要执行三次以上的操作都应该写成脚本,我现在的运维效率比五年前提高了至少三倍。
安全基线:为新系统建立安全基线配置,包括防火墙规则、SSH设置、用户权限等,确保所有服务器都符合最低安全标准。
容量规划:定期检查系统资源使用趋势,提前扩容比半夜处理宕机要轻松得多。我每月会生成资源使用报告并预测未来需求。
故障复盘:每次故障后写事故报告,记录根本原因、处理过程和预防措施,这是团队成长的最佳教材。
持续学习:Linux生态每天都在发展,订阅几个优质的技术博客,每周抽出时间学习新工具和技术。我个人的学习时间是每周五下午。