Linux磁盘满了怎么清理,大文件查找命令
前言
网站突然打不开了?SSH连不上了?一查磁盘100%满了!本文讲怎么查找大文件、清理磁盘空间。
一、查看磁盘使用情况
df命令
df -h
输出:
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 38G 2.0G 95% /
看什么:
- Use%:使用率,超过90%就要注意了
- Avail:可用空间
查看当前目录占用
du -sh
二、查找大文件
查找大于100M的文件
find / -type f -size +100M 2>/dev/null
解释:
- /:从根目录开始找
- -type f:只找文件
- -size +100M:大于100M
- 2>/dev/null:忽略错误信息
查找大于1G的文件
find / -type f -size +1G 2>/dev/null
按大小排序
find / -type f -size +100M 2>/dev/null | xargs du -h | sort -rh
三、查找大目录
查看各目录大小
du -sh /*
一级一级往下找
du -sh /var/*
du -sh /var/log/*
du -sh /var/lib/*
查看前10大目录
du -sh /* | sort -rh | head -10
四、常见大文件位置
1. 日志文件
/var/log/
/var/log/messages
/var/log/nginx/
/var/log/mysql/
2. 临时文件
/tmp/
/var/tmp/
3. 邮件
/var/spool/mail/
4. 数据库文件
/var/lib/mysql/
5. Docker镜像
/var/lib/docker/
6. 上传文件
/www/wwwroot/
/var/www/html/
五、清理方法
清理日志文件
方法1:清空文件
> /var/log/messages
方法2:删除旧日志
find /var/log -name "*.log" -mtime +30 -delete
删除30天前的日志。
清理yum缓存
yum clean all
清理Docker
docker system prune -a
清理临时文件
rm -rf /tmp/*
注意: 正在用的文件别删。
清理旧内核
package-cleanup --oldkernels --count=1
六、查看文件被谁占用
问题: 删了文件但磁盘没释放?
原因: 有进程还在写这个文件。
查看被删除但还被占用的文件
lsof | grep deleted
重启相关进程
systemctl restart nginx
七、常见坑
坑1:删了文件但空间没释放
原因: 进程还在写这个文件。
解决: 重启进程,或者用> 文件名清空。
坑2:日志一直涨
解决: 配置logrotate日志切割。
坑3:Docker占了很多空间
docker system df
清理:
docker system prune -a
八、自动清理脚本
写个脚本定期清理:
#!/bin/bash
# 清理30天前的日志
find /var/log -name "*.log" -mtime +30 -delete
# 清理yum缓存
yum clean all
# 清理Docker
docker system prune -f
加到crontab:
0 3 * * * /bin/bash /root/clean.sh
总结
记住:
- 用
df -h看磁盘使用率 - 用
du -sh /*看哪个目录大 - 用
find / -size +100M找大文件 - 先看日志,再看Docker,再看临时文件
- 删文件前确认不用了
- 删了没释放就重启进程
最常用:
df -h
du -sh /*
find / -type f -size +100M 2>/dev/null
遇到问题加QQ23979811 协助处理
Linux查看端口被占用,lsof和netstat命令
前言
启动服务的时候报"Address already in use"?想知道某个端口被哪个进程占了?Linux查看端口占用最常用的就是lsof和netstat命令,本文讲清楚。
一、为什么要查端口
- 启动服务报端口被占
- 看某个服务有没有启动
- 排查安全问题,看有没有可疑端口
二、lsof命令
查看某个端口被哪个进程占用
lsof -i:端口号
例子: 查80端口
lsof -i:80
输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
看什么:
- COMMAND:进程名(nginx)
- PID:进程ID(1234)
- USER:运行用户(root)
查看所有TCP端口
lsof -i tcp
查看所有UDP端口
lsof -i udp
杀掉占用端口的进程
kill -9 $(lsof -ti:80)
三、netstat命令
查看某个端口
netstat -tlnp | grep 端口号
例子: 查80端口
netstat -tlnp | grep :80
输出:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
看什么:
- 最后一列:进程ID/进程名(1234/nginx)
参数解释
| 参数 | 含义 |
|---|---|
| -t | TCP端口 |
| -l | 只看监听中的 |
| -n | 显示数字,不解析域名 |
| -p | 显示进程名和PID |
查看所有监听端口
netstat -tlnp
四、ss命令(推荐)
ss是netstat的升级版,更快。
查看某个端口
ss -tlnp | grep 端口号
例子:
ss -tlnp | grep :80
查看所有监听端口
ss -tlnp
五、三种命令对比
| 命令 | 优点 | 缺点 |
|---|---|---|
| lsof | 信息全,能看文件 | 慢 |
| netstat | 经典,大家都用 | 慢 |
| ss | 最快,推荐 | 新命令 |
推荐: 用ss,最快。
六、常见场景
场景1:启动Nginx报端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
排查:
lsof -i:80
解决: 杀掉占用的进程
kill -9 进程ID
场景2:看MySQL有没有启动
ss -tlnp | grep 3306
有输出就是启动了。
场景3:看SSH端口
ss -tlnp | grep sshd
七、常见坑
坑1:没加sudo看不到进程
普通用户只能看自己的进程,看不到别人的。
解决: 加sudo
sudo lsof -i:80
sudo netstat -tlnp
坑2:netstat命令找不到
CentOS7最小化安装没有netstat。
安装:
yum install -y net-tools
坑3:lsof命令找不到
安装:
yum install -y lsof
八、常用命令汇总
# 查80端口被谁占了
lsof -i:80
netstat -tlnp | grep :80
ss -tlnp | grep :80
# 看所有监听端口
netstat -tlnp
ss -tlnp
# 杀掉占用80端口的进程
kill -9 $(lsof -ti:80)
总结
记住:
- 查端口用
lsof -i:端口号 - 或者用
ss -tlnp | grep 端口号 - 看最后一列就是进程名和PID
- 杀掉用
kill -9 进程ID - 推荐用ss,最快
最常用:
ss -tlnp | grep :80
遇到问题加QQ23979811 协助处理
Linux查看系统负载,uptime和w命令详解
前言
服务器卡不卡,先看负载。Linux看系统负载最常用的就是uptime和w命令,一行输出就能看到系统跑了多久、现在有多少人登录、负载高不高。本文讲怎么看这些信息。
一、uptime命令
直接敲
uptime
输出:
07:39:01 up 35 days, 2:15, 2 users, load average: 0.08, 0.03, 0.00
逐个解释
| 字段 | 含义 |
|---|---|
| 07:39:01 | 当前时间 |
| up 35 days, 2:15 | 系统运行了35天2小时15分 |
| 2 users | 当前有2个用户登录 |
| load average: 0.08, 0.03, 0.00 | 系统负载,分别是1分钟、5分钟、15分钟 |
负载怎么看
load average三个数:
- 第一个:最近1分钟的平均负载
- 第二个:最近5分钟的平均负载
- 第三个:最近15分钟的平均负载
判断标准:
| 负载值 | 状态 |
|---|---|
| 0.00-0.70 | 正常 |
| 0.70-1.00 | 注意一下 |
| 1.00-2.00 | 有点高 |
| 2.00以上 | 很高了,要排查 |
注意: 负载和CPU核数有关。比如4核CPU,负载4.00才是满。
看CPU核数
nproc
# 4
或者:
cat /proc/cpuinfo | grep processor | wc -l
# 4
判断: 负载小于CPU核数就是正常的。
二、w命令
直接敲
w
输出:
07:39:01 up 35 days, 2:15, 2 users, load average: 0.08, 0.03, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 1.2.3.4 07:35 5.00s 0.03s 0.00s w
www pts/1 5.6.7.8 07:30 8:12 0.01s 0.01s -bash
逐个解释
第一行和uptime一样。
下面是登录用户列表:
| 字段 | 含义 |
|---|---|
| USER | 用户名 |
| TTY | 终端类型(pts/0表示远程连接) |
| FROM | 从哪个IP登录的 |
| LOGIN@ | 登录时间 |
| IDLE | 空闲时间 |
| JCPU | 整个终端所有进程用的CPU时间 |
| PCPU | 当前进程用的CPU时间 |
| WHAT | 当前在跑什么命令 |
三、其他查看命令
who命令
看谁登录了:
who
输出:
root pts/0 2026-10-09 07:35 (1.2.3.4)
www pts/1 2026-10-09 07:30 (5.6.7.8)
last命令
看登录历史:
last
输出最近登录的记录。
lastb命令
看失败的登录:
lastb
四、负载高了怎么排查
第一步:看CPU
top
按P按CPU排序,看哪个进程占CPU多。
第二步:看内存
free -h
看内存够不够,有没有用swap。
第三步:看磁盘
df -h
看磁盘满了没。
第四步:看IO
iostat
看磁盘IO高不高。
五、常见坑
坑1:负载高不代表CPU高
负载包括:
- 正在用CPU的进程
- 等着CPU的进程
- 等着磁盘IO的进程
可能是磁盘IO高,CPU不高,但负载也高。
坑2:负载和核数对比
1核CPU,负载1.0就是满了。
4核CPU,负载4.0才是满了。
别光看数字,要看CPU核数。
坑3:三个负载数的区别
- 1分钟高,5分钟、15分钟不高:可能是突然有个进程跑了一下
- 15分钟都高:说明系统一直很忙
总结
记住:
uptime看系统运行时间和负载w看谁登录了、在干嘛- 负载三个数:1分钟、5分钟、15分钟
- 负载要和CPU核数对比
- 负载高了用top、free、df、iostat排查
最常用:
uptime # 看负载
w # 看谁在登录
top # 看哪个进程占CPU
遇到问题加QQ23979811 协助处理
Linux 查看内存使用
Linux 查看内存使用
服务器内存不够用的时候,得知道谁在吃内存。
1. free 命令
最常用的查看内存命令:
free -h
输出说明:
- total: 总内存
- used: 已用内存
- free: 空闲内存
- shared: 共享内存
- buff/cache: 缓存
- available: 可用内存
注意: 不要只看 free,要看 available。Linux 会用空闲内存做缓存,这是好事。
2. top 命令
实时查看内存占用:
top
常用操作:
- 按
M按内存排序 - 按
P按CPU排序 - 按
q退出
重点看:
- %MEM:进程内存占用百分比
- RES:进程实际占用物理内存
3. ps 命令
查看进程内存占用:
# 按内存占用排序,前10
ps aux --sort=-%mem | head -10
输出说明:
- USER:进程用户
- %MEM:内存占用
- RSS:实际物理内存(KB)
- COMMAND:进程命令
4. vmstat 命令
查看整体内存和CPU:
# 每秒刷新一次
vmstat 1
重点列:
- swpd:交换分区使用
- free:空闲内存
- buff:缓冲区
- cache:缓存
- si:换入内存
- so:换出内存
注意: si 和 so 大于0说明内存不够,在用swap。
5. /proc/meminfo
查看详细内存信息:
cat /proc/meminfo
重点看:
- MemTotal:总内存
- MemFree:空闲内存
- MemAvailable:可用内存
- Buffers:缓冲区
- Cached:缓存
- SwapTotal:交换分区总量
- SwapFree:交换分区空闲
6. 缓存说明
Linux 内存缓存机制:
- 空闲内存用来做文件缓存
- 程序需要时会自动释放
- cached 高不是坏事
- available 才是真正可用的
7. 内存不够怎么办
1)找出吃内存的进程
ps aux --sort=-%mem | head
2)重启大内存进程
- 确认是哪个进程
- 重启释放内存
3)清理缓存
# 清理页面缓存
echo 1 > /proc/sys/vm/drop_caches
# 清理目录项和inode
echo 2 > /proc/sys/vm/drop_caches
# 全部清理
echo 3 > /proc/sys/vm/drop_caches
4)加交换分区
- 临时方案,治标不治本
- 最好加物理内存
8. 常用组合命令
# 查看内存占用前5的进程
ps aux --sort=-%mem | head -6
# 查看swap使用最多的进程
for i in $(ls /proc | grep -E '^[0-9]+'); do
awk '/VmSwap/{print $2/1024 " MB", $0}' /proc/$i/status 2>/dev/null
done | sort -nr | head
9. 监控建议
1)设置内存告警
- 超过80%告警
- 及时处理
2)定期检查
- 每天看一次内存
- 发现异常及时处理
3)不要盲目清缓存
- 缓存是好事
- 清缓存会降低性能
总结
Linux 查看内存使用要点:
- free -h 看整体内存
- top 按M看内存占用
- ps aux 排序找大进程
- vmstat 看swap使用
- /proc/meminfo 看详细信息
- 不要只看 free,要看 available
- cached 高是好事
- 内存不够先找大进程
- 清缓存要谨慎
- 最好加物理内存
学会看内存,服务器问题就好排查了。
Linux 查看磁盘空间
Linux 查看磁盘空间
服务器磁盘满了怎么办?这些命令帮你快速排查。
1. df 查看整体磁盘
基本用法
# 查看磁盘使用情况
df
# 人性化显示(带M、G单位)
df -h
常用参数
- -h: 人性化显示大小
- -T: 显示文件系统类型
- -i: 查看 inode 使用情况
# 常用组合
df -hT
输出说明:
- Filesystem: 磁盘分区
- Size: 总大小
- Used: 已用
- Avail: 可用
- Use%: 使用率
- Mounted on: 挂载点
2. du 查看目录大小
查看当前目录大小
# 当前目录总大小
du -sh
# 查看指定目录
du -sh /var/log
查看子目录大小
# 查看当前目录下每个子目录大小
du -sh *
# 按大小排序
du -sh * | sort -rh
常用参数
- -s: 只显示总计
- -h: 人性化显示
- --max-depth=1: 只看一层
# 查看根目录下各目录大小
du -sh /* --max-depth=1
3. 查找大文件
查找大于100M的文件
find / -type f -size +100M -exec ls -lh {} \;
查找最近修改的大文件
find /var -type f -size +50M -mtime -7
4. 常见排查场景
1)磁盘满了
# 先看哪个分区满了
df -h
# 找到大目录
du -sh /* | sort -rh
2)日志占空间
# 查看日志目录大小
du -sh /var/log
# 清空大日志文件
> /var/log/large.log
3)inode满了
# 查看inode使用
df -i
5. 清理磁盘
清理日志文件
# 清空文件(不删除文件)
> /var/log/messages
# 删除旧日志
rm /var/log/*.old
清理缓存
# 清理包缓存
yum clean all
清理 Docker 没用的镜像
docker system prune -a
总结
Linux 查看磁盘空间要点:
- df -h 查看整体磁盘使用
- du -sh 查看目录大小
- find 查找大文件
- 磁盘满了先看分区,再找大目录
- 日志文件要定期清理
- 注意 inode 也可能满
- 用 sort -rh 按大小排序
运维排查磁盘问题,这些命令天天用。
Linux 查看系统日志
Linux 查看系统日志
排查问题先看日志,这些命令要记住。
1. 系统日志位置
/var/log/messages # 系统主日志
/var/log/syslog # Debian/Ubuntu 系统日志
/var/log/boot.log # 启动日志
/var/log/cron # 定时任务日志
/var/log/secure # 安全日志(登录、sudo等)
/var/log/nginx/ # Nginx 日志
/var/log/httpd/ # Apache 日志
/var/log/mysql/ # MySQL 日志
2. 基本查看命令
cat:查看全部
cat /var/log/messages
tail:看末尾几行(最常用)
# 看最后10行
tail /var/log/messages
# 看最后20行
tail -n 20 /var/log/messages
# 实时跟踪日志(最常用)
tail -f /var/log/messages
head:看开头几行
head -n 10 /var/log/messages
3. 搜索日志
grep:搜索关键词
# 搜索错误信息
grep "error" /var/log/messages
# 不区分大小写
grep -i "error" /var/log/messages
# 显示行号
grep -n "error" /var/log/messages
# 反向匹配(不包含error)
grep -v "debug" /var/log/messages
结合管道
# 实时日志里搜索错误
tail -f /var/log/messages | grep "error"
# 搜索最近的nginx错误
tail -n 1000 /var/log/nginx/error.log | grep "500"
4. journalctl 查看 systemd 日志
# 查看全部日志
journalctl
# 看最后100行
journalctl -n 100
# 实时跟踪
journalctl -f
# 按服务查看
journalctl -u nginx
# 按时间查看
journalctl --since "1 hour ago"
journalctl --since "2024-01-01" --until "2024-01-02"
5. 常用排查场景
1)服务器登录失败
grep "Failed password" /var/log/secure
2)服务起不来
systemctl status nginx
journalctl -u nginx -n 50
3)磁盘满了
df -h
du -sh /var/log/*
4)定时任务没执行
cat /var/log/cron
6. 日志清理
手动删除大日志
# 查看日志大小
du -sh /var/log/*
# 清空日志(不删除文件)
> /var/log/messages
# 删除旧日志
rm /var/log/messages.1
logrotate 自动切割
- Linux 自带日志切割工具
- 配置文件在 /etc/logrotate.conf
- 一般不用管,自动轮转
总结
Linux 查看日志要点:
- 日志都在 /var/log/ 目录
- tail -f 实时看日志最常用
- grep 搜索关键词
- journalctl 查 systemd 服务日志
- 排查问题先看错误日志
- 日志太大要及时清理
- 系统自动轮转不用手动管
运维排查,看日志是第一步。
Linux 文件权限详解
Linux 文件权限详解
Linux 权限是基础,搞不懂经常出问题。
1. 查看权限
ls -l
输出:
-rw-r--r-- 1 root root 1000 Oct 8 10:00 test.txt
2. 权限含义
第一位:文件类型
-
- 普通文件
- d 目录
- l 软链接
后面9位:分3组
- 第1组:所有者权限
- 第2组:所属组权限
- 第3组:其他人权限
3个字母:
- r 读(4)
- w 写(2)
- x 执行(1)
比如 rw-r--r--:
- 所有者:读写(6)
- 组:只读(4)
- 其他人:只读(4)
3. 修改权限 chmod
数字方式:
# 所有者读写执行,组读执行,其他人读执行
chmod 755 test.sh
# 所有人只读
chmod 444 test.txt
字母方式:
# 给所有者加执行权限
chmod u+x test.sh
# 给组加写权限
chmod g+w test.txt
# 去掉其他人的读权限
chmod o-r test.txt
4. 修改所有者 chown
# 修改所有者
chown www:www test.txt
# 递归修改目录
chown -R www:www /www/wwwroot
5. 常用权限
- 目录:755(所有者读写执行,其他人读执行)
- 普通文件:644(所有者读写,其他人只读)
- 脚本文件:755
6. 常见问题
1)网站打不开:
- 检查目录权限是不是 755
- 检查文件权限是不是 644
- 检查所有者是不是 www
2)上传不了文件:
- 检查目录有没有写权限
3)脚本执行不了:
- 检查有没有执行权限
总结
Linux 文件权限要点:
- r=4, w=2, x=1
- chmod 修改权限
- chown 修改所有者
- 目录 755,文件 644
- 权限不对经常出问题
做运维,权限一定要搞懂。
Linux 防火墙配置详解
Linux 防火墙配置详解
服务器安全第一步就是防火墙,学会配置很重要。
1. firewalld(CentOS 7+)
查看状态:
systemctl status firewalld
开启/关闭:
# 开启
systemctl start firewalld
# 关闭
systemctl stop firewalld
# 开机自启
systemctl enable firewalld
2. 开放端口
开放单个端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
开放多个端口:
firewall-cmd --zone=public --add-port=80-90/tcp --permanent
重新加载生效:
firewall-cmd --reload
3. 查看端口
# 查看所有开放端口
firewall-cmd --list-ports
# 查看某个端口是否开放
firewall-cmd --query-port=80/tcp
4. 关闭端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --reload
5. iptables(旧版)
查看规则:
iptables -L -n
开放端口:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
保存规则:
service iptables save
6. 常用端口
# 常用端口
22 SSH
80 HTTP
443 HTTPS
3306 MySQL
6379 Redis
8080 Tomcat
7. 常见问题
1)端口开了还是访问不了:
- 检查云服务商安全组
- 检查服务器内部防火墙
2)远程连接不上:
- 检查 22 端口是否开放
- 检查 sshd 是否启动
总结
Linux 防火墙要点:
- firewalld 管理端口
- --permanent 永久生效
- --reload 重新加载
- 记得开放安全组
- 常用端口按需开放
做运维,防火墙是基本功。
MySQL忘记root密码重置(Linux环境)
MySQL root密码忘了进不去数据库?别慌,按下面步骤操作,5分钟就能重置。
1. 先停止MySQL服务
systemctl stop mysqld
CentOS 7 默认是这个命令,如果是 mariadb 就改成 systemctl stop mariadb。
2. 跳过权限验证启动MySQL
mysqld_safe --skip-grant-tables &
这一步会跳过密码验证,直接进入MySQL,不需要输密码。
3. 无密码登录MySQL
mysql -u root
现在直接就能进去了,不需要密码。
4. 重置root密码
USE mysql;
-- MySQL 5.7 及以上版本
UPDATE user SET authentication_string = PASSWORD('你的新密码') WHERE User = 'root';
-- 如果是 MySQL 5.6 及以下版本
UPDATE user SET password = PASSWORD('你的新密码') WHERE User = 'root';
FLUSH PRIVILEGES;
EXIT;
把 你的新密码 换成你想设置的新密码,注意密码强度。
5. 重启MySQL服务
systemctl start mysqld
6. 用新密码登录测试
mysql -u root -p
输入刚才设置的新密码,能登录就成功了。
常见坑
坑1:mysqld_safe 找不到
有些系统用的是 mysqld,试试:
mysqld --skip-grant-tables &
坑2:改完密码登录还是不行
一定要执行 FLUSH PRIVILEGES;,不然不生效。
坑3:密码太简单报错
MySQL 有密码强度要求,新密码最好是字母+数字+符号,8位以上。
坑4:MySQL 8.0 版本
MySQL 8.0 改密码的语法不一样:
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
遇到问题加QQ23979811 协助处理
Linux 查看系统资源
Linux 查看系统资源
服务器卡了慢了,得知道哪个进程占资源多。整理常用的查看命令。
1. 查看内存使用
# 查看内存使用情况
free -h
# 持续查看
free -h 1
输出说明:
- total:总内存
- used:已使用
- free:空闲
- buff/cache:缓存
- available:可用
2. 查看 CPU 负载
# 查看 CPU 信息
top
# 按 q 退出
top 常用快捷键:
- P:按 CPU 排序
- M:按内存排序
- 1:查看每个核心
3. 查看磁盘使用
# 查看磁盘空间
df -h
# 查看目录大小
du -sh /www/
# 查看当前目录下每个文件大小
du -sh *
4. 查看进程
# 查看所有进程
ps aux
# 查看 PHP 进程
ps aux | grep php
# 查看端口占用
netstat -tlnp
5. 查看系统信息
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -a
# 查看 CPU 核心数
nproc
# 查看内存大小
cat /proc/meminfo | head -5
6. 查找大文件
# 查找大于100M的文件
find / -type f -size +100M
# 查找最近7天修改的文件
find /www -type f -mtime -7
7. 常用场景
网站卡了:
- top 看 CPU 和内存
- df -h 看磁盘满没满
- 看日志
内存不够用:
- free -h 看内存
- top 按 M 排序找占内存大的进程
总结
常用命令记这几个:
- 内存:free -h
- CPU:top
- 磁盘:df -h / du -sh
- 进程:ps aux
- 端口:netstat
做运维这些命令天天用,必须熟。
Linux 防火墙配置详解
Linux 防火墙配置详解
服务器安全第一关就是防火墙,配置错了就远程连不上了,这篇讲常用配置。
1. firewalld(CentOS7 默认)
查看状态:
# 查看防火墙状态
firewall-cmd --state
# 查看开放的端口
firewall-cmd --list-ports
# 查看开放的服务
firewall-cmd --list-services
开放端口:
# 开放 80 端口
firewall-cmd --permanent --add-port=80/tcp
# 开放 443 端口
firewall-cmd --permanent --add-port=443/tcp
# 开放多个端口范围
firewall-cmd --permanent --add-port=8000-9000/tcp
# 重载生效
firewall-cmd --reload
关闭端口:
# 关闭 80 端口
firewall-cmd --permanent --remove-port=80/tcp
# 重载
firewall-cmd --reload
开放服务:
# 开放 nginx 服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 重载
firewall-cmd --reload
2. iptables(老系统常用)
查看规则:
iptables -L -n
开放端口:
# 开放 22 端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 开放 80 端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 保存规则
service iptables save
3. 常用安全配置
只允许指定 IP 访问 SSH:
# 只允许 192.168.1.100 访问 22 端口
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port protocol='tcp' port='22' accept"
# 拒绝其他所有 IP
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
4. 常用端口说明
| 端口 | 服务 |
|---|---|
| 22 | SSH 远程连接 |
| 80 | HTTP 网站 |
| 443 | HTTPS 网站 |
| 3306 | MySQL 数据库 |
| 6379 | Redis 缓存 |
| 8080 | 应用服务 |
5. 常见问题
1)SSH 连不上了:
- 检查防火墙是不是把 22 端口关了
- 用控制台登录服务器重新开放
2)网站打不开:
- 检查 80/443 端口开了没
- 重载防火墙生效
3)数据库连不上:
- 3306 端口别对公网开放
- 只允许本地或指定 IP 访问
总结
防火墙配置记住三点:
- 先开 22 端口,不然自己都连不上
- 网站开 80 和 443
- 数据库别对外网开放
安全第一,别图省事直接关防火墙。
Linux查看系统运行级别,multi-user.target详解
前言
经常听到别人说"运行级别 3"、"运行级别 5",这是什么意思?CentOS7 之后用 systemd 代替了老的 SysVinit,运行级别也变成了 target。本文讲一下怎么查看和切换系统运行级别。
老的运行级别(SysVinit)
老系统(CentOS6 之前)用数字表示运行级别:
| 级别 | 含义 |
|---|---|
| 0 | 关机 |
| 1 | 单用户模式(救援模式) |
| 2 | 多用户模式(无 NFS) |
| 3 | 完全多用户模式(命令行,服务器常用) |
| 4 | 未使用 |
| 5 | 图形界面模式 |
| 6 | 重启 |
新的 target(systemd)
CentOS7 之后用 target 代替了数字运行级别:
| target | 对应老级别 | 含义 |
|---|---|---|
| poweroff.target | 0 | 关机 |
| rescue.target | 1 | 救援模式 |
| multi-user.target | 3 | 命令行模式(服务器常用) |
| graphical.target | 5 | 图形界面模式 |
| reboot.target | 6 | 重启 |
查看当前运行级别
systemctl 命令
systemctl get-default
输出:
multi-user.target
就是当前默认的运行级别是命令行模式。
老命令(还能用)
runlevel
输出类似:
N 3
第一个是上次运行级别(N 表示没有),第二个是当前运行级别。
切换运行级别
临时切换(重启后恢复)
systemctl isolate 目标target
比如从图形界面切到命令行:
systemctl isolate multi-user.target
或者从命令行切到图形界面:
systemctl isolate graphical.target
永久切换(重启后生效)
systemctl set-default 目标target
比如默认启动到命令行模式:
systemctl set-default multi-user.target
默认启动到图形界面:
systemctl set-default graphical.target
常用操作
进入救援模式
系统出问题了进不去?进救援模式:
systemctl rescue
进入紧急模式
更底层的救援模式:
systemctl emergency
关机
systemctl poweroff
或者:
systemctl halt
重启
systemctl reboot
常见坑
坑1:图形界面切命令行后黑屏
执行了 isolate multi-user.target,屏幕黑了。
原因: 这是正常的,切到命令行模式就是黑屏,只有终端提示符。
解决: 输入用户名密码登录就行。
坑2:设置了 multi-user.target 但还是进图形界面
执行了 set-default multi-user.target,但重启后还是进图形界面。
原因: 可能有多个桌面管理器在抢着启动。
解决: 确认一下:
systemctl get-default
应该显示 multi-user.target。如果不对,再执行一次。
坑3:把运行级别设成 0 或 6 了
不小心设成了 poweroff.target 或 reboot.target。
后果: 一开就关机或者一开就重启,无限循环。
解决: 进救援模式改回来。
总结
| 命令 | 作用 |
|---|---|
systemctl get-default |
查看当前默认运行级别 |
systemctl set-default multi-user.target |
设置为命令行模式 |
systemctl set-default graphical.target |
设置为图形界面模式 |
systemctl isolate multi-user.target |
临时切到命令行 |
systemctl isolate graphical.target |
临时切到图形界面 |
runlevel |
老命令查看运行级别 |
服务器一般用 multi-user.target(命令行模式),更省资源、更稳定。
遇到问题加QQ23979811 协助处理
Linux查看端口被哪个进程占用,lsof命令
前言
启动服务的时候提示 "Address already in use",端口被占了,但不知道被哪个进程占了?这时候就需要用 lsof 或者 netstat 命令来查一下。本文讲一下怎么用。
lsof 命令
安装
CentOS 最小化安装可能没有 lsof:
yum install -y lsof
查看某个端口被哪个进程占用
lsof -i:端口号
比如看 80 端口被谁占了:
lsof -i:80
输出类似:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
重点看:
PID:进程号COMMAND:进程名
知道了 PID 之后,想杀掉就用 kill PID。
查看所有正在监听的端口
lsof -i -P -n | grep LISTEN
输出所有处于监听状态的端口和对应的进程。
netstat 命令
安装
来自 net-tools 包:
yum install -y net-tools
查看端口被哪个进程占用
netstat -tlnp | grep 端口号
比如看 80 端口:
netstat -tlnp | grep :80
输出类似:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
最后一列就是 PID/进程名。
参数解释
| 参数 | 含义 |
|---|---|
-t |
显示 TCP 连接 |
-l |
只显示监听状态的 |
-n |
显示数字,不解析域名 |
-p |
显示进程名和 PID |
查看所有监听端口
netstat -tlnp
fuser 命令
查看端口被哪个进程占用
fuser 端口号/tcp
比如:
fuser 80/tcp
输出:
80/tcp: 1234
直接显示 PID,简单粗暴。
杀掉占用端口的进程
fuser -k 80/tcp
直接把占用 80 端口的进程杀掉。
常见场景
场景1:启动 Nginx 提示端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
查一下:
lsof -i:80
发现是旧的 nginx 进程没杀掉,直接杀:
kill 1234
或者:
fuser -k 80/tcp
场景2:3306 端口不知道被谁占了
lsof -i:3306
发现是 MySQL 进程,正常的。
场景3:找出所有被占用的端口
netstat -tlnp
列出所有正在监听的端口。
常见坑
坑1:lsof 命令找不到
执行 lsof 提示 command not found。
原因: 没装 lsof 包。
解决:
yum install -y lsof
坑2:普通用户看不到其他用户的进程
用普通用户执行 lsof,看不到 root 的进程。
原因: 权限不够。
解决: 加 sudo 或者切 root:
sudo lsof -i:80
坑3:端口明明没被占但提示被占
服务明明没启动,但启动时提示端口被占。
原因: 可能有 TIME_WAIT 状态的连接还没释放。
解决: 等一会儿再试,或者改端口。
坑4:杀了进程端口还是没释放
杀掉进程了,但端口还是显示被占。
原因: 进程还在退出中,等几秒就好了。
总结
| 命令 | 作用 |
|---|---|
lsof -i:端口号 |
查看端口被哪个进程占用 |
netstat -tlnp \| grep :端口号 |
用 netstat 查端口 |
fuser 端口号/tcp |
查看端口对应的 PID |
fuser -k 端口号/tcp |
杀掉占用端口的进程 |
最常用的就是 lsof -i:端口号,一眼就能看到进程名和 PID。
遇到问题加QQ23979811 协助处理
Linux上传下载文件,rz和sz命令使用
前言
经常需要从本地电脑上传文件到服务器,或者把服务器上的文件下载到本地。除了用 FTP 工具,还有更简单的 rz 和 sz 命令,直接在终端里就能操作。本文讲一下怎么用。
安装 lrzsz
rz 和 sz 命令来自 lrzsz 包,CentOS 最小化安装可能没有:
yum install -y lrzsz
Ubuntu 的话:
apt install -y lrzsz
rz 上传文件(从本地上传到服务器)
基本用法
直接输入:
rz
执行后会弹出一个文件选择窗口,选你要上传的文件,点确定就开始上传了。
注意: 文件会上传到你当前所在的目录。
指定文件名
上传后直接改成指定名字:
rz -y 新文件名
-y 是覆盖同名文件。
上传多个文件
执行 rz 之后在文件选择窗口可以按住 Ctrl 多选。
sz 下载文件(从服务器下载到本地)
下载单个文件
sz 文件名
比如下载 index.html:
sz index.html
执行后会弹出保存窗口,选保存位置就开始下载了。
下载多个文件
sz 文件1 文件2 文件3
比如:
sz a.txt b.txt c.txt
下载整个目录(先打包)
sz 不能直接下载目录,要先打包:
tar -zcvf backup.tar.gz /var/www/html
sz backup.tar.gz
常见使用场景
场景1:上传配置文件
# 先进入要上传的目录
cd /etc/nginx/conf.d/
# 上传
rz
选本地的 nginx 配置文件,上传完就直接放到这个目录了。
场景2:下载日志文件
# 进入日志目录
cd /var/log/nginx/
# 下载访问日志
sz access.log
场景3:上传压缩包
本地把项目打包成 zip,然后:
cd /var/www/html/
rz
选本地的项目 zip 文件,上传完再解压。
常见坑
坑1:rz 命令找不到
执行 rz 提示 command not found。
原因: 没装 lrzsz 包。
解决:
yum install -y lrzsz
坑2:上传的文件不知道去哪了
执行了 rz,但不知道文件上传到哪了。
原因: 文件上传到你当前所在的目录。
解决: 上传前先 pwd 看一下当前目录在哪。
坑3:用了某些 SSH 工具不支持 rz/sz
有些 SSH 客户端(比如 Windows 自带的 cmd)不支持 rz/sz。
原因: rz/sz 需要终端支持 ZModem 协议。
解决: 用支持的 SSH 工具,比如 Xshell、SecureCRT、FinalShell、MobaXterm。
坑4:大文件上传慢
上传几百 M 的文件特别慢。
原因: rz/sz 走的是 SSH 通道,速度不快。
解决: 大文件用 SFTP 或者专门的传输工具(FileZilla)更快。
坑5:上传的文件是乱码
上传完中文文件名变成乱码。
原因: 编码问题。
解决: 用英文文件名,或者先打包成 zip 再上传。
总结
| 命令 | 作用 |
|---|---|
rz |
从本地上传文件到服务器 |
sz 文件名 |
从服务器下载文件到本地 |
前提: 要先装 lrzsz 包,而且 SSH 工具要支持 ZModem 协议。
小文件用 rz/sz 很方便,大文件还是用 SFTP 吧。
遇到问题加QQ23979811 协助处理
Linux查看所有服务,systemctl命令大全
前言
CentOS7 之后用 systemctl 管理服务,代替了老的 service 和 chkconfig 命令。本文把常用的 systemctl 命令都整理出来,新手照着用就行。
查看服务
查看所有服务
systemctl list-units --type=service
列出所有正在运行的服务。
查看所有服务(包括没运行的)
systemctl list-unit-files --type=service
查看正在运行的服务
systemctl list-units --type=service --state=running
查看某个服务状态
systemctl status 服务名
比如看 nginx 状态:
systemctl status nginx
输出会显示服务是否在运行、PID、内存占用、最近日志等。
启动和停止服务
启动服务
systemctl start 服务名
比如:
systemctl start nginx
停止服务
systemctl stop 服务名
比如:
systemctl stop nginx
重启服务
systemctl restart 服务名
比如:
systemctl restart nginx
重载配置(不重启)
修改了配置文件后,用 reload 重载,不用重启:
systemctl reload 服务名
比如:
systemctl reload nginx
平滑重启(reload 不行就用这个)
systemctl reload-or-restart 服务名
设置开机自启
开启开机自启
systemctl enable 服务名
比如:
systemctl enable nginx
关闭开机自启
systemctl disable 服务名
比如:
systemctl disable nginx
查看是否开机自启
systemctl is-enabled 服务名
输出 enabled 就是开机自启,disabled 就是不是。
其他常用操作
查看服务是否在运行
systemctl is-active 服务名
输出 active 就是在运行,inactive 就是没运行。
查看服务日志
journalctl -u 服务名
比如看 nginx 日志:
journalctl -u nginx
实时看服务日志
journalctl -u 服务名 -f
和 tail -f 一样,实时输出最新日志。
查看服务开机自启状态
systemctl list-unit-files --type=service | grep enabled
列出所有开机自启的服务。
常见服务名
| 服务名 | 对应服务 |
|---|---|
| nginx | Nginx 网页服务 |
| httpd | Apache 网页服务 |
| mysqld | MySQL 数据库 |
| firewalld | 防火墙 |
| crond | 定时任务 |
| sshd | SSH 远程连接 |
| php-fpm | PHP 解析 |
| redis | Redis 缓存 |
常见坑
坑1:服务名写错了
执行 systemctl 报错 Unit xxx.service could not be found。
原因: 服务名写错了。
解决: 先列一下所有服务,找到正确的服务名:
systemctl list-unit-files --type=service | grep 关键词
坑2:启动了服务但还是访问不了
服务显示 active,但外部还是访问不了。
原因: 防火墙没开端口,或者服务本身配置错了。
解决: 先看防火墙开了没,再看服务日志:
journalctl -u 服务名
坑3:开机自启了但重启后没起来
设置了 enable,但重启后服务还是没启动。
原因: 服务配置有问题,启动失败了。
解决: 看日志找原因:
journalctl -u 服务名
坑4:用了老命令 service
执行 service nginx start 能用,但不推荐了。
原因: 这是老命令,新系统都用 systemctl。
解决: 换成 systemctl start nginx。
总结
| 操作 | 命令 |
|---|---|
| 查看所有服务 | systemctl list-units --type=service |
| 查看服务状态 | systemctl status 服务名 |
| 启动服务 | systemctl start 服务名 |
| 停止服务 | systemctl stop 服务名 |
| 重启服务 | systemctl restart 服务名 |
| 重载配置 | systemctl reload 服务名 |
| 开机自启 | systemctl enable 服务名 |
| 关闭开机自启 | systemctl disable 服务名 |
| 查看日志 | journalctl -u 服务名 |
systemctl 就这几个常用命令,记住就够用了。
遇到问题加QQ23979811 协助处理
Linux怎么修改主机名,永久生效方法
前言
新装好的服务器默认主机名是 localhost 或者一串乱七八糟的字符,不好区分。怎么改成自己想要的名字,而且重启后还生效?本文讲一下。
查看当前主机名
先看看现在主机名是什么:
hostname
输出类似:
localhost.localdomain
修改主机名的方法
方法一:hostnamectl(推荐,CentOS7+)
这是最方便的方法,一条命令永久生效:
hostnamectl set-hostname 新主机名
比如改成 web-server:
hostnamectl set-hostname web-server
注意: 主机名只能用小写字母、数字、横杠(-),不能用下划线、中文、空格。
方法二:修改配置文件
编辑 /etc/hostname 文件:
vi /etc/hostname
把里面的内容改成新的主机名,保存退出。
然后重启生效:
reboot
或者不重启,手动让它生效:
hostname 新主机名
方法三:临时修改
只改当前运行时的主机名,重启后就恢复:
hostname 新主机名
注意: 这个只是临时生效,重启后还是原来的。
修改后验证
重新登录一下 SSH,或者执行:
bash
让当前 shell 生效,然后看:
hostname
应该显示新的主机名了。
同时修改 hosts
有些服务(比如 MySQL)会用到主机名,最好同时把 /etc/hosts 也改一下:
vi /etc/hosts
找到类似这一行:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
在后面加上新主机名:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 web-server
保存退出。
常见坑
坑1:改了主机名但命令行没变
执行了 hostnamectl set-hostname,但命令行前面还是显示旧的。
原因: 当前 shell 会话没刷新。
解决: 退出重新登录 SSH,或者执行 bash 开个新 shell。
坑2:重启后又变回原来的
改了主机名,重启之后又变回去了。
原因: 只执行了 hostname 新名字(临时修改),没改配置文件。
解决: 用 hostnamectl set-hostname 新名字 永久修改。
坑3:主机名有大写或者下划线
主机名用了大写字母或者下划线,有些服务报错。
原因: 主机名规范要求只能用小写字母、数字、横杠。
正确写法: web-server-01
错误写法: Web_Server_01
坑4:改了主机名导致服务连不上
改了主机名之后,某些服务连不上数据库或者其他服务。
原因: 那些服务里配置的还是旧主机名。
解决: 把相关服务的配置里的主机名也改过来,或者同时改 /etc/hosts 做映射。
总结
| 方法 | 命令 | 是否永久 |
|---|---|---|
| hostnamectl | hostnamectl set-hostname 新名字 |
是(推荐) |
| 修改 /etc/hostname | 编辑文件后重启 | 是 |
| hostname | hostname 新名字 |
否(临时) |
推荐用 hostnamectl set-hostname,一条命令搞定,永久生效。
遇到问题加QQ23979811 协助处理
Linux查看网卡信息,ip addr和ifconfig命令
前言
想知道服务器有几块网卡、IP 地址是多少、MAC 地址是多少?Linux 下有两个常用命令:ip addr 和 ifconfig。本文讲一下它们的用法和区别。
ip addr 命令(推荐)
现在新的 Linux 系统都推荐用 ip 命令,功能比 ifconfig 更强大。
查看所有网卡信息
ip addr
或者简写:
ip a
输出类似:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
输出解释
| 字段 | 含义 |
|---|---|
lo |
本地回环网卡 |
eth0 |
物理网卡名称 |
state UP |
网卡状态是开启的 |
link/ether |
MAC 地址 |
inet |
IP 地址 |
/24 |
子网掩码(255.255.255.0) |
只看 IP 地址
不想看那么多信息,只看 IP:
ip addr show eth0 | grep inet
或者更简洁:
ip a s eth0
只看 IPv4 地址
ip -4 addr
查看网卡统计信息
ip -s link
能看到收发包、丢包等统计信息。
ifconfig 命令(老命令)
ifconfig 是老命令,来自 net-tools 包,现在慢慢被淘汰了,但很多老用户还是习惯用。
安装
CentOS 最小化安装可能没有:
yum install -y net-tools
查看所有网卡
ifconfig
输出类似:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:16:3e:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 12345 bytes 1234567 (1.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6789 bytes 987654 (987.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0
只看某个网卡
ifconfig eth0
查看 lo 网卡
ifconfig 默认不显示 lo(回环网卡),要看的话加 -a:
ifconfig -a
ip 和 ifconfig 的区别
| 对比项 | ip addr | ifconfig |
|---|---|---|
| 新老 | 新命令,推荐 | 老命令,逐步淘汰 |
| 包 | iproute2 包(默认装) | net-tools 包(要单独装) |
| 功能 | 更强大 | 基本够用 |
| 输出 | 信息更全 | 简洁 |
其他常用命令
查看路由表
ip route
或者老命令:
route -n
查看 DNS 配置
cat /etc/resolv.conf
查看网卡连接状态
cat /sys/class/net/eth0/carrier
输出 1 表示网线插着,0 表示没插。
查看网卡速率
ethtool eth0 | grep Speed
常见坑
坑1:ifconfig 命令找不到
执行 ifconfig 提示 command not found。
原因: CentOS7 最小化安装不带 net-tools 包。
解决:
yum install -y net-tools
或者直接用 ip addr,不用装包。
坑2:网卡名不是 eth0
新系统网卡名可能是 ens33、ens33、enp0s3 之类的。
原因: CentOS7 用了新的网卡命名规则。
解决: 先 ip addr 看一下实际网卡名是什么,然后替换。
坑3:IP 地址不对
看到的 IP 地址和你预期的不一样。
原因: 可能有多个网卡,或者是云服务器的内网 IP,不是公网 IP。
解决: 先 ip addr 看所有网卡,确认哪个是你要的。
坑4:网卡 down 了
网卡状态是 DOWN,连不上网。
解决: 手动开启:
ip link set eth0 up
或者:
ifconfig eth0 up
总结
| 命令 | 作用 |
|---|---|
ip addr |
查看所有网卡信息(推荐) |
ip a |
简写 |
ip a s eth0 |
只看 eth0 网卡 |
ifconfig |
老命令查看网卡 |
ifconfig eth0 |
只看 eth0 |
ip route |
查看路由表 |
现在都推荐用 ip addr,功能更全,还不用额外装包。
遇到问题加QQ23979811 协助处理
Linux查看历史命令,history命令使用技巧
前言
在服务器上敲了很多命令,突然想找之前执行过的某条命令,怎么办?history 命令就能帮你查看历史命令。本文讲一下 history 的常用用法和技巧。
基本用法
查看历史命令
history
输出会列出你执行过的所有命令,每条前面有个编号,比如:
100 yum install -y wget
101 systemctl restart nginx
102 df -h
执行第 N 条历史命令
用 !编号 直接执行:
!101
就会重新执行第 101 条命令。
执行上一条命令
几种方式都行:
!!
或者按向上方向键,再回车。
搜索历史命令
输入开头几个字母,然后按 Ctrl + R:
(reverse-i-search)`sys': systemctl restart nginx
会搜索你输入过的包含这个关键词的历史命令,找到之后回车执行。
再按一次 Ctrl + R 会继续往前找下一个匹配的。
常用技巧
只看最近 N 条
history 10
只看最近 10 条命令。
搜索历史命令里的关键词
history | grep 关键词
比如找所有包含 nginx 的命令:
history | grep nginx
执行最近一条以某个关键词开头的命令
!关键词
比如最近一条以 yum 开头的命令:
!yum
会直接执行最近一次输入的 yum 开头的命令。
替换上一条命令里的内容
比如上一条命令是 cp file1.txt file2.txt,想改成 mv file1.txt file2.txt:
^cp^mv
这样就把上一条命令里的 cp 替换成 mv 再执行。
清空历史命令
清空当前会话的历史
history -c
注意:这个只是清空当前内存里的历史,还没写入文件。
清空历史文件
history -w
把当前内存里的历史写入文件(覆盖掉旧的)。
彻底清空
history -c
history -w
两步一起执行,彻底清空所有历史命令。
删除某一条历史命令
history -d 编号
比如删除第 100 条:
history -d 100
历史命令保存在哪
历史命令默认保存在:
~/.bash_history
每个用户都有自己的 .bash_history 文件。
查看历史文件
cat ~/.bash_history
修改历史记录条数
默认记录 1000 条,可以改:
echo "HISTSIZE=10000" >> /etc/profile
echo "HISTFILESIZE=10000" >> /etc/profile
source /etc/profile
改成记录 10000 条。
常见坑
坑1:history 看不到刚执行的命令
刚执行完的命令,history 里没有。
原因: 历史命令是在退出会话的时候才写入文件的,当前会话的历史在内存里。
解决: 执行 history 就能看到当前会话的所有命令,包括刚执行的。
坑2:history -c 清不干净
执行了 history -c,但重新登录后又出来了。
原因: 只清了内存,没清文件。
解决: 还要执行 history -w 写入文件。
坑3:别人 history 能看到我输的密码
不小心在命令行里输了密码,比如 mysql -uroot -p123456,history 里就有了。
解决:
- 执行完之后赶紧删掉那条历史:
history -d 编号 - 以后输密码不要直接写在命令里,用交互式输入:
mysql -uroot -p,然后回车再输密码
坑4:多开几个终端,历史命令对不上
开了多个 SSH 窗口,在这个窗口执行的命令,另一个窗口 history 里看不到。
原因: 每个终端会话有自己的内存历史,退出时才写入文件。
解决: 这是正常现象,不用纠结。
总结
| 命令 | 作用 |
|---|---|
history |
查看历史命令 |
history 10 |
只看最近 10 条 |
!101 |
执行第 101 条历史命令 |
!! |
执行上一条命令 |
!yum |
执行最近一条 yum 开头的命令 |
history \| grep nginx |
搜索包含 nginx 的历史命令 |
history -c |
清空当前会话历史 |
Ctrl + R |
搜索历史命令 |
日常用得最多的就是 Ctrl + R 搜索 和 history | grep,效率很高。
遇到问题加QQ23979811 协助处理
Linux压缩解压命令大全,tar、zip、unzip用法
前言
服务器上经常需要压缩文件或者解压上传的压缩包,tar、zip、unzip 这些命令怎么用?本文把最常用的压缩解压命令都整理出来,一次讲清楚。
tar 命令(最常用)
tar 是 Linux 下最常用的打包压缩工具,支持 gzip、bzip2、xz 等多种压缩格式。
参数速记
| 参数 | 含义 |
|---|---|
-c |
创建新的打包文件 |
-x |
解压 |
-z |
用 gzip 压缩(.tar.gz) |
-j |
用 bzip2 压缩(.tar.bz2) |
-J |
用 xz 压缩(.tar.xz) |
-v |
显示过程 |
-f |
指定文件名(必须放最后) |
压缩成 .tar.gz
最常用的,把目录打包成 tar.gz:
tar -zcvf 打包名.tar.gz 要打包的目录
比如把 /var/www/html 打包成 backup.tar.gz:
tar -zcvf backup.tar.gz /var/www/html
解压 .tar.gz
tar -zxvf 文件名.tar.gz
比如:
tar -zxvf backup.tar.gz
解压到指定目录
加 -C 参数:
tar -zxvf backup.tar.gz -C /目标目录
比如解压到 /tmp 目录:
tar -zxvf backup.tar.gz -C /tmp
只看不解压
tar -ztvf 文件名.tar.gz
列出压缩包里的文件列表,不解压。
.tar.bz2 格式
比 gzip 压缩率更高,但更慢:
# 压缩
tar -jcvf backup.tar.bz2 /var/www/html
# 解压
tar -jxvf backup.tar.bz2
.tar.xz 格式
压缩率最高,最慢:
# 压缩
tar -Jcvf backup.tar.xz /var/www/html
# 解压
tar -Jxvf backup.tar.xz
zip 和 unzip
安装
CentOS 最小化安装可能没有 zip/unzip:
yum install -y zip unzip
压缩成 zip
zip -r 打包名.zip 要打包的目录
比如:
zip -r backup.zip /var/www/html
-r 是递归,把目录下所有文件都打进去。
解压 zip
unzip 文件名.zip
比如:
unzip backup.zip
解压到指定目录
unzip 文件名.zip -d /目标目录
比如解压到 /tmp:
unzip backup.zip -d /tmp
只看不解压
unzip -l 文件名.zip
列出 zip 包里的文件列表。
解压到指定目录并覆盖
unzip -o 文件名.zip -d /目标目录
-o 是覆盖,不提示。
其他压缩格式
gz 格式(单文件压缩)
# 压缩
gzip 文件名
# 解压
gunzip 文件名.gz
bz2 格式
# 压缩
bzip2 文件名
# 解压
bunzip2 文件名.bz2
常见坑
坑1:解压后目录结构不对
解压完发现多套了一层目录。
原因: 打包的时候是带路径打的。
解决: 解压前先看一下压缩包里的结构:
tar -ztvf 文件名.tar.gz
或者 zip 用:
unzip -l 文件名.zip
坑2:解压时磁盘空间不足
解压到一半报错 No space left on device。
原因: 磁盘满了。
解决: 先看一下磁盘空间:
df -h
清理空间后再解压。
坑3:tar 参数顺序不对
执行 tar 报错。
原因: -f 参数必须放最后,后面紧跟文件名。
正确写法: tar -zcvf backup.tar.gz /目录
错误写法: tar -fzc backup.tar.gz /目录
坑4:zip 命令找不到
执行 zip 提示 command not found。
原因: 没装 zip 包。
解决:
yum install -y zip unzip
总结
| 格式 | 压缩命令 | 解压命令 |
|---|---|---|
| .tar.gz | tar -zcvf 名.tar.gz 目录 |
tar -zxvf 名.tar.gz |
| .tar.bz2 | tar -jcvf 名.tar.bz2 目录 |
tar -jxvf 名.tar.bz2 |
| .zip | zip -r 名.zip 目录 |
unzip 名.zip |
| .gz | gzip 文件名 |
gunzip 文件名.gz |
最常用的就是 tar -zcvf 压缩 和 tar -zxvf 解压,记住这两个就够用了。
遇到问题加QQ23979811 协助处理
Linux查看系统启动时间,uptime命令详解
前言
想知道服务器从上次开机到现在跑了多久?或者想看系统负载?uptime 命令一行就能搞定。本文详细讲一下这个命令的用法。
uptime 命令
基本用法
直接输入:
uptime
输出类似:
07:49:21 up 2:15, 1 user, load average: 0.00, 0.01, 0.05
输出解释
| 字段 | 含义 |
|---|---|
07:49:21 |
当前系统时间 |
up 2:15 |
系统已经运行了 2 小时 15 分钟 |
1 user |
当前有 1 个用户登录 |
load average: 0.00, 0.01, 0.05 |
1分钟、5分钟、15分钟的平均负载 |
常用参数
显示漂亮一点
uptime -p
输出类似:
up 2 hours, 15 minutes
显示系统启动时间
uptime -s
输出类似:
2026-10-06 05:34:21
这就是系统上次启动的具体时间。
查看系统启动时间的其他方法
who 命令
who -b
输出类似:
system boot 2026-10-06 05:34
last 命令
last reboot | head -5
列出最近几次重启记录:
reboot system boot 3.10.0-1160.el7. Fri Oct 6 05:34 - 07:49 (02:15)
reboot system boot 3.10.0-1160.el7. Thu Oct 5 09:12 - 22:00 (12:47)
systemd-analyze
systemd-analyze
显示系统启动花了多长时间:
Startup finished in 1.234s (kernel) + 2.345s (initrd) + 10.123s (userspace) = 13.702s
负载(load average)怎么看
uptime 最后三个数字是负载,很多人不知道怎么判断高不高。
三个数字的含义
- 第一个:1 分钟平均负载
- 第二个:5 分钟平均负载
- 第三个:15 分钟平均负载
怎么判断高不高
负载和 CPU 核心数有关:
- 负载 < CPU核心数:正常
- 负载 ≈ CPU核心数:刚好饱和
- 负载 > CPU核心数:过载了
查看 CPU 核心数
nproc
输出就是核心数。
比如你的服务器是 4 核 CPU:
- 负载 1.0:很闲
- 负载 4.0:刚好跑满
- 负载 8.0:过载了
常见坑
坑1:负载高但 CPU 不高
负载很高,但 top 看 CPU 使用率不高。
原因: 可能是 I/O 等待高(磁盘读写慢),或者有大量进程在排队。
解决: 用 top 看 %wa 列(I/O 等待),如果高就是磁盘问题。
坑2:up 时间不对
uptime 显示的运行时间和你印象中的不一样。
原因: 系统可能自动重启过,或者你记错了。
解决: 用 last reboot 看历史重启记录。
坑3:1 user 不对
uptime 显示只有 1 个用户,但你明明看到好几个人登录。
原因: 显示的是登录会话数,不是用户数。同一个用户开多个 SSH 连接会算多个会话。
解决: 用 w 命令看详细的在线用户。
总结
| 命令 | 作用 |
|---|---|
uptime |
看运行时间和负载 |
uptime -p |
漂亮格式显示运行时间 |
uptime -s |
显示系统启动时间 |
who -b |
看系统启动时间 |
last reboot |
看历史重启记录 |
nproc |
看 CPU 核心数 |
日常运维用 uptime 一行就能看个大概,很方便。
遇到问题加QQ23979811 协助处理