Linux查看文件大小,du和df命令区别

前言

服务器磁盘满了,不知道哪个目录占的空间最大?du 和 df 是两个最常用的查看磁盘空间的命令,但很多人搞不清它们的区别。本文一次讲清楚。

du 和 df 的区别

du(Disk Usage)

看的是文件和目录占用的磁盘空间。

比如某个目录下有多少文件,总共占多少空间。

df(Disk Free)

看的是磁盘分区的整体使用情况。

比如整个硬盘总共有多大,用了多少,还剩多少。

一句话总结

  • du:看文件/目录占了多少
  • df:看磁盘分区总共多大、剩多少

df 命令

查看整体磁盘使用情况

df -h

-h 是 human-readable 的意思,输出成 K、M、G 的易读格式。

输出类似:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        50G   30G   18G  63% /
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/sdb1       100G   50G   45G  53% /data

只看某个分区

df -h /

只看根分区的使用情况。

显示文件系统类型

df -Th

多了一列 Type,显示是 ext4、xfs 还是其他类型。

du 命令

查看某个目录占多大空间

du -sh 目录路径

比如看 /var 目录:

du -sh /var

-s 是 summary,只显示总计;-h 是易读格式。

输出类似:

5.2G    /var

查看当前目录下每个子目录的大小

du -sh *

输出当前目录下每个子目录占多大空间。

按大小排序

du -sh * | sort -hr

sort -hr 是按数字从大到小排,这样就能一眼看到哪个子目录最大。

找当前目录下最大的10个文件

du -ah . | sort -hr | head -10

-a 是包括文件,不只是目录。

只看一层深度

du -h --max-depth=1 /var

只看 /var 下第一层的子目录大小,不往下钻。

常见场景

场景1:磁盘满了,找大文件

# 先看哪个分区满了
df -h

# 然后去那个分区找大目录
cd /
du -sh * | sort -hr | head -10

# 找到大目录后继续往下钻
cd /var
du -sh * | sort -hr | head -10

一步步找到占空间最大的文件,然后删掉。

场景2:看日志占了多少

du -sh /var/log

场景3:看网站占了多少

du -sh /var/www/html

常见坑

坑1:du 和 df 显示的已用空间不一样

明明删了大文件,但 df 显示还是满的。

原因: 文件被进程占用着,删了之后空间没真正释放。

解决: 找到占用这个文件的进程,重启或者杀掉:

lsof | grep deleted

找到 PID 后重启对应的服务。

坑2:du 命令跑了半天还在跑

du 一个大目录,半天没反应。

原因: 目录太大,文件太多。

解决: 加 --max-depth=1 限制深度,或者先确认一下目录有多大再决定要不要跑。

坑3:df 显示已用空间和 du 对不上

df 显示用了 80G,但 du 加起来才 50G。

原因: 可能有隐藏文件、挂载点下面的文件,或者有进程占用着已删除的文件。

解决: 检查:

# 看有没有挂载点
mount

# 看有没有已删除但还被占用的文件
lsof | grep deleted

坑4:du 显示的大小和 ls 不一样

ls 显示文件是 10M,du 显示是 11M。

原因: du 看的是磁盘块占用,文件系统按块分配空间,实际占用会比文件大小略大一点。

解决: 正常现象,不用纠结。

总结

命令 作用
df -h 看磁盘分区整体使用情况
du -sh 目录 看某个目录占多大空间
du -sh * | sort -hr 看当前目录下每个子目录大小并排序
du -h --max-depth=1 目录 只看一层深度
lsof | grep deleted 看已删除但被进程占用的文件

日常运维记住:df 看分区,du 看目录。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:46 

Linux文件权限755、644含义,chmod修改权限

前言

Linux 文件权限是新手最头疼的东西之一,经常遇到 403 权限不足的报错。755、644 这些数字到底是什么意思?怎么改?本文一次讲清楚。

权限基础

三种身份

Linux 把用户分三类:

  • 文件所有者(u):文件的主人
  • 同组用户(g):和主人在同一个组的人
  • 其他用户(o):所有人

三种权限

每种身份有三种权限:

  • 读(r):4
  • 写(w):2
  • 执行(x):1

加起来就是权限数字。

755、644 是什么意思

755

7 = rwx(读+写+执行)= 4+2+1
5 = r-x(读+执行)= 4+1
5 = r-x(读+执行)= 4+1

合起来就是:所有者能读写执行,同组和其他用户只能读和执行。

常用于: 目录、可执行脚本

644

6 = rw-(读+写)= 4+2
4 = r--(只读)= 4
4 = r--(只读)= 4

合起来就是:所有者能读写,其他人只能读。

常用于: 普通文件、网页

常用权限速查表

数字 含义 用途
755 rwxr-xr-x 目录、脚本
644 rw-r--r-- 普通文件、网页
700 rwx------ 私人目录
600 rw------- 私人文件(比如密钥)
777 rwxrwxrwx 所有人都能读写执行(不推荐)

chmod 修改权限

数字方式(最常用)

chmod 755 文件名

比如把 index.php 改成 644:

chmod 644 index.php

字母方式

chmod u+x 文件名

意思是给所有者(u)加执行权限(x)。

常用的:

  • u+x:所有者加执行权限
  • u-w:所有者去掉写权限
  • g+w:同组加写权限
  • o+r:其他用户加读权限
  • a+x:所有人加执行权限

递归修改目录下所有文件

加 -R 参数:

chmod -R 755 /var/www/html

警告: 递归改权限要小心,别把系统目录改坏了。

chown 修改所有者

有时候不是权限数字的问题,是文件属主不对。

查看文件属主

ls -l 文件名

输出第一列后面就是属主:

-rw-r--r-- 1 www www 1234 Oct  6 10:00 index.php

前面的 www 是用户,后面的 www 是组。

修改文件属主

chown 用户:组 文件名

比如把文件改成 www 用户:

chown www:www index.php

递归修改目录属主

chown -R www:www /var/www/html

常见坑

坑1:网站 403 权限不足

网页打不开,报 403 Forbidden。

原因: 文件权限不对,或者属主不对。

解决:

  1. 文件改成 644:chmod 644 文件
  2. 目录改成 755:chmod 755 目录
  3. 属主改成运行用户:chown www:www 文件

坑2:777 万能解决?

一遇到权限问题就 chmod 777。

原因: 图省事,但不安全。

解决: 777 意味着所有人都能读写执行,恶意文件可以直接往你的目录里写木马。生产环境绝对不要用 777。

坑3:改了权限还是不行

执行了 chmod 还是报权限不足。

原因: SELinux 拦截了。

解决: 检查 SELinux:

getenforce

如果是 Enforcing,临时关掉试试:

setenforce 0

坑4:上传文件没有执行权限

写了个脚本想运行,报 Permission denied。

原因: 文件没有执行权限。

解决:

chmod +x 脚本.sh

总结

命令 作用
chmod 755 文件名 改成 755 权限
chmod 644 文件名 改成 644 权限
chmod -R 755 目录 递归改目录权限
chown www:www 文件名 改文件属主
chown -R www:www 目录 递归改目录属主

记住两个常用的:目录 755,文件 644,基本就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:45 

Linux创建用户、删除用户、修改密码完整命令

前言

服务器上要加新用户、删旧用户、改密码,这些都是日常操作。本文把常用的用户管理命令都整理出来,新手也能照着做。

创建用户

useradd 命令

最简单的创建用户:

useradd 用户名

比如创建一个叫 zhangsan 的用户:

useradd zhangsan

创建完之后,这个用户还不能登录,因为没设密码。

创建用户并设密码

一行搞定:

useradd zhangsan && passwd zhangsan

执行 passwd zhangsan 之后会提示输入两次密码。

创建用户并指定家目录

默认家目录是 /home/用户名,想改的话用 -d:

useradd -d /data/zhangsan zhangsan

创建用户并指定用户组

useradd -g 用户组 用户名

比如把 zhangsan 加到 www 组:

useradd -g www zhangsan

创建用户并指定 UID

useradd -u 1001 zhangsan

修改密码

passwd 命令

修改某个用户的密码:

passwd 用户名

比如修改 zhangsan 的密码:

passwd zhangsan

执行后会提示输入两次新密码。

自己改密码

passwd

直接执行,会提示输入旧密码,然后输入新密码两次。

免交互改密码(脚本用)

写脚本的时候不能交互式输入,用这个:

echo "新密码" | passwd --stdin 用户名

比如:

echo "123456" | passwd --stdin zhangsan

删除用户

userdel 命令

只删用户,不删家目录:

userdel 用户名

比如:

userdel zhangsan

删除用户并删家目录

加 -r 参数,把家目录也删掉:

userdel -r zhangsan

警告: -r 会把 /home/zhangsan 整个删掉,里面的文件都没了,确认清楚再执行。

查看用户信息

查看用户 UID、GID、组

id 用户名

比如:

id zhangsan

输出类似:

uid=1001(zhangsan) gid=1001(zhangsan) 组=1001(zhangsan)

查看用户信息

grep 用户名 /etc/passwd

查看所有用户

cat /etc/passwd

每行一个用户,格式是:

用户名:x:UID:GID:注释:家目录:登录Shell

常见坑

坑1:创建用户后不能登录

创建了用户但 SSH 登录不了。

原因: 没设密码,或者 Shell 是 /sbin/nologin。

解决:

  1. 先设密码:passwd 用户名
  2. 检查 Shell:grep 用户名 /etc/passwd,最后一列应该是 /bin/bash

如果是 /sbin/nologin,改回来:

usermod -s /bin/bash 用户名

坑2:删了用户但家目录还在

执行了 userdel zhangsan,但 /home/zhangsan 还在。

原因: 没加 -r 参数。

解决: 手动删:

rm -rf /home/zhangsan

坑3:普通用户没权限 sudo

新用户不能用 sudo。

原因: 没加到 sudoers 里。

解决: 加到 wheel 组(CentOS)或者 sudo 组(Ubuntu):

usermod -aG wheel 用户名

坑4:密码过期了

用户突然不能登录了,提示密码过期。

解决: root 改密码:

passwd 用户名

或者设置密码永不过期:

chage -M 99999 用户名

总结

操作 命令
创建用户 useradd 用户名
设密码 passwd 用户名
删除用户 userdel 用户名
删除用户+家目录 userdel -r 用户名
查看用户信息 id 用户名
加 sudo 权限 usermod -aG wheel 用户名

日常运维就这几个命令,够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:44 

Linux查看进程占用内存最高,kill进程方法

前言

服务器内存用满了,不知道哪个进程占的?找到之后怎么杀掉?本文就讲一下怎么查看占用内存最高的进程,以及怎么 kill 掉。

查看内存占用

top 命令(最常用)

top

打开后默认按 CPU 排序,按 M 键(大写)就会按内存排序。

输出里重点看:

  • PID:进程号
  • USER:运行用户
  • %MEM:内存占用百分比
  • RES:实际用的物理内存(KB)

按 q 退出。

ps 命令

一行命令直接看内存占用前 10:

ps aux --sort=-%mem | head -10

输出按内存从大到小排,前 10 个就是最占内存的。

只看进程名和 PID

ps aux --sort=-%mem | head -10 | awk '{print $2, $11}'

只显示 PID 和进程名,更简洁。

kill 杀掉进程

kill 命令

先从 top 或 ps 里找到进程 PID,然后:

kill 进程号

比如杀掉 PID 为 1234 的进程:

kill 1234

kill -9 强制杀

有时候 kill 没用,进程就是不死,用 -9 强制杀:

kill -9 1234

注意: -9 是强杀,进程没机会清理资源,可能导致数据丢失。尽量先试普通 kill,不行再 -9。

pkill 按名字杀

不用找 PID,直接按进程名杀:

pkill nginx

杀掉所有叫 nginx 的进程。

killall 杀同名进程

killall nginx

和 pkill 类似,也是按名字杀。

常用操作示例

找出最占内存的进程并杀掉

# 找前5个最占内存的
ps aux --sort=-%mem | head -5

# 假设 PID 是 1234,杀掉
kill 1234

杀掉所有 php-fpm 进程

pkill php-fpm

杀掉某个用户的所有进程

pkill -u www

常见坑

坑1:杀错进程了

把系统关键进程杀了,服务器直接挂。

解决: 杀之前先确认一下这个进程是干嘛的:

ps -p 进程号 -o comm=

或者:

ls -l /proc/进程号/exe

坑2:kill 了进程又自动起来了

杀掉之后过几秒又自动启动了。

原因: 有服务管理工具(systemd、supervisor)在监控,挂了就自动拉起。

解决: 先停服务再杀:

systemctl stop nginx

或者:

supervisorctl stop nginx

坑3:kill 没权限

普通用户杀不了 root 启动的进程。

解决: 加 sudo 或切 root:

sudo kill 1234

总结

命令 作用
top 实时看进程,按 M 按内存排序
ps aux --sort=-%mem 按内存排序看进程
kill 进程号 正常杀进程
kill -9 进程号 强制杀进程
pkill 进程名 按名字杀进程
killall 进程名 杀同名所有进程

服务器内存爆了就用 top 按 M 排序,找到最占内存的杀掉就行。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:41 

Linux 压缩命令大全

Linux 常用压缩命令大全

Linux 下压缩解压命令很多,记不住每次都要搜,整理一份常用清单。

1. tar 命令(最常用)

tar 是 Linux 最常用的打包工具,可以配合不同压缩格式。

打包不压缩:

# 打包
tar -cvf blog.tar /www/wwwroot/blog/

# 解包
tar -xvf blog.tar

参数说明:

  • -c:创建打包文件
  • -x:解包
  • -v:显示过程
  • -f:指定文件名

2. tar.gz 格式(最常用)

# 压缩
tar -zcvf blog.tar.gz /www/wwwroot/blog/

# 解压
tar -zxvf blog.tar.gz

# 解压到指定目录
tar -zxvf blog.tar.gz -C /data/backup/

-z 就是用 gzip 压缩,这是最常用的格式。

3. tar.bz2 格式(压缩率更高)

# 压缩(体积更小,但更慢)
tar -jcvf blog.tar.bz2 /www/wwwroot/blog/

# 解压
tar -jxvf blog.tar.bz2

4. zip 格式

# 压缩
zip -r blog.zip /www/wwwroot/blog/

# 解压
unzip blog.zip

# 解压到指定目录
unzip blog.zip -d /data/backup/

Windows 用户常用 zip 格式,跨平台方便。

5. gz 格式

# 压缩(单个文件)
gzip file.log

# 解压
gunzip file.log.gz

gzip 只能压单个文件,一般和 tar 配合用。

6. 查看压缩包内容

# 查看 tar 包内容
tar -tvf blog.tar

# 查看 tar.gz 包内容
tar -ztvf blog.tar.gz

# 查看 zip 包内容
unzip -l blog.zip

7. 常用场景示例

备份网站文件:

tar -zcvf backup_$(date +%Y%m%d).tar.gz /www/wwwroot/blog/

备份数据库:

mysqldump -u root -p123456 blog | gzip > db_$(date +%Y%m%d).sql.gz

传输文件压缩:

tar -zcvf - /www/wwwroot/blog/ | ssh root@192.168.1.100 "tar -zxvf - -C /backup/"

8. 总结

格式 压缩率 速度 命令
tar.gz 中 快 tar -z
tar.bz2 高 慢 tar -j
zip 中 中 zip/unzip
tar 无 最快 tar

日常用 tar.gz 就够了,跨平台用 zip,追求小体积用 bz2。


emer 发布于  2026-10-6 07:40 

Linux怎么查看当前在线用户,踢出用户命令

前言

服务器是多人用的,有时候需要看看谁在线上,或者把某个挂机的用户踢下线。Linux 自带了几个命令可以查看当前在线用户,本文就讲一下怎么用。

查看在线用户

who 命令

最简单的命令,直接看谁在线:

who

输出类似:

root     pts/0        2026-10-06 09:00 (192.168.1.100)
zhangsan pts/1        2026-10-06 09:15 (192.168.1.101)
lisi     pts/2        2026-10-06 09:20 (192.168.1.102)

每一列分别是:用户名、终端、登录时间、来源 IP。

w 命令

比 who 更详细,还能看到用户在干嘛:

w

输出类似:

 09:30:00 up  2:15,  3 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.1.100    09:00    5.00s  0.03s  0.01s w
zhangsan pts/1    192.168.1.101    09:15    15.00s 0.02s  0.00s bash
lisi     pts/2    192.168.1.102    09:20    1:30   0.01s  0.01s top

多了几列:

  • LOGIN@:登录时间
  • IDLE:空闲时间
  • JCPU:该终端所有进程用的 CPU 时间
  • PCPU:当前进程用的 CPU 时间
  • WHAT:当前在跑什么命令

users 命令

只看用户名,重复的就重复显示:

users

输出:

root zhangsan lisi

last 命令

看历史登录记录:

last

会列出最近登录过的用户,包括用户名、终端、来源 IP、登录时间、退出时间、总共在线多久。

踢出用户

pkill 踢出某个用户

比如把 zhangsan 踢下线:

pkill -u zhangsan

这会杀掉 zhangsan 的所有进程,直接把他踢下线。

杀掉某个终端

先看 who,找到要踢的人的终端,比如 pts/1:

who

然后杀掉这个终端:

pkill -t pts/1

或者:

kill -9 $(ps -t pts/1 -o pid=)

踢所有非 root 用户

警告!这会把其他所有登录的人都踢掉:

pkill -u -root

常见坑

坑1:把自己踢下线了

执行 pkill 的时候把自己的终端也杀掉了,SSH 直接断开。

解决: 踢人的时候确认一下自己的终端,别把自己踢了:

who am i

先看自己是哪个终端,然后踢别人的时候避开自己的终端。

坑2:踢了用户但他又登回来了

踢了之后用户马上又登上来了,没用。

解决: 如果是恶意用户,直接改密码或者封 IP:

# 改密码
passwd 用户名

# 封 IP
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.101' reject"
firewall-cmd --reload

坑3:看不到图形界面登录的用户

who 只看终端登录的,图形界面登录的可能看不到。

解决: 用 last 看历史记录,或者看 /var/log/auth.log(CentOS 是 /var/log/secure)。

总结

查看在线用户的常用命令:

命令 作用
who 看谁在线
w 看谁在线 + 在干嘛
users 只看用户名
last 看历史登录记录
pkill -u 用户名 踢出某个用户
pkill -t pts/1 杀掉某个终端

日常运维用 w 就够了,信息最全。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-6 07:40 

MySQL忘记root密码重置(Linux环境)

前言

做运维或者开发的同学肯定遇到过这种情况:服务器上的MySQL数据库用了很久,突然有一天忘记了root密码,登录不进去了。这时候项目可能正在运行,不能随便重装数据库,那怎么办呢?

别慌,MySQL提供了一种跳过权限验证的启动方式,我们可以用这种方式登录进去,然后重置root密码。这篇文章就详细讲讲在Linux环境下怎么重置MySQL的root密码。

操作步骤

1. 先停止MySQL服务

首先我们需要把正在运行的MySQL服务停掉:

systemctl stop mysqld

如果你用的是MariaDB,命令是:

systemctl stop mariadb

执行完之后可以检查一下MySQL是不是真的停了:

ps aux | grep mysql

如果没有看到mysql进程,说明已经停掉了。

2. 跳过权限验证启动MySQL

接下来我们要用 --skip-grant-tables 参数启动MySQL,这样启动之后就可以不用密码直接登录了。

mysqld_safe --skip-grant-tables &

注意最后面的 & 符号,这个是让MySQL在后台运行。

执行完这个命令之后,等个几秒钟,让MySQL完全启动起来。

3. 无密码登录MySQL

现在我们就可以不用密码直接登录MySQL了:

mysql -u root

执行完之后直接就进入MySQL命令行界面了,不需要输入密码。

4. 修改root密码

登录进去之后,我们就可以修改root密码了。

首先选择mysql数据库:

USE mysql;

然后修改root密码。注意不同版本的MySQL,修改密码的语句不一样:

MySQL 5.7版本:

UPDATE user SET authentication_string=PASSWORD('你的新密码') WHERE User='root';

MySQL 8.0版本:

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';

修改完密码之后,一定要执行一下刷新权限的命令:

FLUSH PRIVILEGES;

然后退出MySQL:

EXIT;

5. 关闭跳过权限的MySQL进程,正常重启MySQL

现在我们需要把刚才用跳过权限方式启动的MySQL进程关掉,然后用正常方式重启。

先找到MySQL的进程ID:

ps aux | grep mysqld_safe

然后杀掉这个进程:

kill -9 进程ID

等个几秒钟,让MySQL完全关闭。然后用正常方式启动MySQL:

systemctl start mysqld

6. 验证新密码能不能登录

最后我们来验证一下新密码能不能正常登录:

mysql -u root -p

输入你刚才设置的新密码,如果能正常登录进去,说明密码重置成功了。

常见坑

坑1:修改密码之后忘了执行FLUSH PRIVILEGES

很多同学修改完密码之后直接就退出了,结果发现重启MySQL之后密码还是不对。这是因为修改完密码之后一定要执行 FLUSH PRIVILEGES 刷新权限,不然修改不会生效。

坑2:MySQL版本不一样,修改密码的语句不一样

很多同学抄网上的教程,结果修改密码的语句不对,报错了。这是因为MySQL 5.7和MySQL 8.0修改密码的方式不一样。5.7用的是 authentication_string 字段,8.0用的是 ALTER USER 语句。

你可以先执行一下这个命令看看你的MySQL版本:

SELECT VERSION();

然后用对应的语句修改密码。

坑3:跳过权限启动的时候没加 & 符号

如果执行 mysqld_safe --skip-grant-tables 的时候没加 & 符号,那这个命令就会一直占着你的终端窗口,你没法继续操作了。所以一定要记得在最后面加个 & 符号,让它在后台运行。

坑4:杀进程的时候杀错了

杀进程的时候一定要看清楚,不要把其他无关的进程杀掉了。最好先 ps aux | grep mysqld 看一下,确认哪个是我们刚才启动的跳过权限的MySQL进程。

总结

Linux环境下重置MySQL root密码的步骤总结一下:

  1. 停止MySQL服务
  2. 用 --skip-grant-tables 参数跳过权限启动
  3. 无密码登录MySQL
  4. 修改root密码
  5. 刷新权限
  6. 关闭跳过权限的进程,正常重启MySQL
  7. 用新密码验证登录

记住这几个步骤,以后忘记root密码的时候就不用慌了,按照这个流程操作就能搞定。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 08:31 

Linux服务管理,systemctl常用命令汇总

前言

CentOS7 装完软件,怎么启动?怎么开机自启?服务挂了怎么查日志?这些都需要用到 systemctl 命令。CentOS7 开始用 systemd 代替了原来的 service 命令,systemctl 就是 systemd 的管理工具。本文就把 systemctl 常用命令汇总一下,日常管理服务够用了。

启动和停止服务

启动服务

systemctl start nginx

停止服务

systemctl stop nginx

重启服务

systemctl restart nginx

重新加载配置

systemctl reload nginx

注意: reload 和 restart 的区别:

  • reload:不重启进程,重新加载配置,不中断服务
  • restart:重启进程,会短暂中断服务

查看服务状态

查看服务状态

systemctl status nginx

输出会显示服务是不是在运行、PID、内存占用、最近的日志等。

查看服务是不是在运行

systemctl is-active nginx

输出 active 就是在运行,inactive 就是没运行。

查看服务是不是开机自启

systemctl is-enabled nginx

输出 enabled 就是开机自启,disabled 就是不自启。

开机自启管理

设置开机自启

systemctl enable nginx

取消开机自启

systemctl disable nginx

同时启动并设置开机自启

systemctl enable --now nginx

一条命令搞定,不用分两步。

查看日志

查看服务日志

journalctl -u nginx

实时跟踪日志

journalctl -u nginx -f

和 tail -f 类似,实时滚动显示日志。

查看最近100行日志

journalctl -u nginx -n 100

查看今天的日志

journalctl -u nginx --since today

查看指定时间的日志

journalctl -u nginx --since "2026-10-05 10:00:00" --until "2026-10-05 11:00:00"

查看所有服务

列出所有正在运行的服务

systemctl list-units --type=service

列出所有服务(包括没运行的)

systemctl list-unit-files --type=service

按状态过滤

systemctl list-units --type=service --state=running

常用服务管理示例

启动 Nginx 并设置开机自启

systemctl start nginx
systemctl enable nginx

或者一条命令:

systemctl enable --now nginx

重启 Nginx

systemctl restart nginx

查看 Nginx 状态

systemctl status nginx

查看 Nginx 日志

journalctl -u nginx -f

常见坑

坑1:还在用 service 命令

CentOS6 用 service nginx start,CentOS7 开始用 systemctl start nginx。老命令还能用,但新系统推荐用 systemctl。

坑2:改了配置不生效

改了 Nginx 配置,忘了 reload,结果配置没生效。

解决: 改完配置记得 reload:

systemctl reload nginx

坑3:服务启动失败不知道为啥

服务启动失败,只看状态不知道具体原因。

解决: 看日志:

journalctl -u nginx

坑4:重启服务器后服务没自启

装完软件启动了,但没设置开机自启,重启之后服务就没了。

解决: 装完软件记得设置开机自启:

systemctl enable nginx

总结

systemctl 常用命令:

命令 作用
systemctl start 服务名 启动服务
systemctl stop 服务名 停止服务
systemctl restart 服务名 重启服务
systemctl reload 服务名 重新加载配置
systemctl status 服务名 查看服务状态
systemctl enable 服务名 设置开机自启
systemctl disable 服务名 取消开机自启
systemctl is-active 服务名 查看是否在运行
systemctl is-enabled 服务名 查看是否开机自启
journalctl -u 服务名 -f 实时查看日志

记住这几个,CentOS7+ 日常管理服务就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:51 

Linux软件包管理,yum常用命令汇总

前言

CentOS 装软件怎么装?装完怎么卸?找不到某个软件包名怎么办?这些都需要用到 yum 命令。yum 是 CentOS/RHEL 系统的软件包管理器,自动解决依赖关系,比 rpm 好用多了。本文就把 yum 常用命令汇总一下,装软件、卸软件、查软件都能用。

安装软件

安装软件包

yum install nginx -y

-y 表示自动确认,不用手动输 y。

安装多个软件包

yum install nginx mysql php -y

重新安装

yum reinstall nginx -y

软件装坏了想重装,用这个。

卸载软件

卸载软件包

yum remove nginx -y

卸载并删除依赖

yum autoremove nginx -y

把安装 nginx 时自动装上的依赖也一起删掉。

更新软件

更新所有软件

yum update -y

注意: 这个会把所有软件都更新一遍,包括内核。生产环境慎用,可能会把系统搞挂。

更新某个软件

yum update nginx -y

只更新 nginx。

检查哪些软件可以更新

yum check-update

查找软件

搜索软件包

yum search nginx

模糊搜索,输出所有名字或描述里包含 nginx 的包。

查找文件属于哪个包

yum provides /usr/sbin/nginx

你知道某个文件路径,但不知道是哪个包装的,用这个查。

查看软件包信息

yum info nginx

输出软件包的详细信息:版本、大小、描述等。

查看已安装软件

列出所有已安装的包

yum list installed

太多了可以配合 grep:

yum list installed | grep nginx

查看某个软件装没装

yum list installed nginx

仓库管理

查看已启用的仓库

yum repolist

查看所有仓库(包括禁用的)

yum repolist all

清理缓存

yum clean all

yum 下载的包会缓存下来,占磁盘空间。定期清理一下。

重建缓存

yum makecache

常用场景

场景1:装 Nginx

yum install nginx -y
systemctl start nginx
systemctl enable nginx

场景2:不知道软件包名

想装个下载工具,但不知道叫什么。

yum search wget

或者:

yum search curl

场景3:某个命令找不到

输入 ifconfig 提示 command not found,不知道是哪个包装的。

yum provides ifconfig

会告诉你是 net-tools 包提供的,装一下:

yum install net-tools -y

场景4:软件版本太旧

CentOS7 自带的软件版本都比较老,比如 Nginx 是 1.20。想用新版本,需要加第三方源。

装 EPEL 源:

yum install epel-release -y

装完 EPEL 源之后,就能装更多软件包了。

常见坑

坑1:yum install 不加 -y

不加 -y 的话,安装到一半会停下来问你 Is this ok [y/d/N],自动化脚本里很容易卡在这里。

解决: 命令后面加 -y:

yum install nginx -y

坑2:yum update 把系统搞挂了

生产环境跑了 yum update -y,结果内核更新了,重启之后服务起不来。

解决: 生产环境不要随便 yum update,要更新就单独更新某个软件:

yum update nginx -y

坑3:找不到软件包

用默认源搜不到某个软件,比如 Docker、Node.js 这些。

解决: 加第三方源,比如 EPEL:

yum install epel-release -y

坑4:yum 缓存满了

yum 缓存的包占了很多磁盘空间。

解决: 定期清理:

yum clean all

总结

yum 常用命令:

命令 作用
yum install 包名 -y 安装软件
yum remove 包名 -y 卸载软件
yum update 包名 -y 更新软件
yum search 关键词 搜索软件
yum provides 文件路径 查文件属于哪个包
yum info 包名 查看软件包信息
yum list installed 列出已安装的包
yum repolist 查看仓库列表
yum clean all 清理缓存

记住这几个,CentOS 日常装软件就够用了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:50 

Linux文件权限详解,chmod和chown命令使用

前言

Nginx 报 403 Forbidden?文件改完了不生效?权限不对导致各种奇怪问题?Linux 的文件权限是新手最容易搞混的地方。什么是 rwx?755 和 644 有什么区别?chown 和 chmod 分别是干嘛的?本文就把 Linux 文件权限讲明白,让你一看就懂。

查看文件权限

用 ls -l 查看文件详细信息:

ls -l /var/www/html/index.html

输出示例:

-rw-r--r-- 1 nginx nginx 1234 Oct  5 10:30 /var/www/html/index.html

权限字符串详解

最开头的 -rw-r--r-- 就是权限,拆解一下:

-  rw-  r--  r--
①  ②    ③    ④
  • ① 文件类型: - 是普通文件,d 是目录,l 是链接
  • ② 所有者权限(user): rw- = 可读可写,不可执行
  • ③ 所属组权限(group): r-- = 只读
  • ④ 其他人权限(other): r-- = 只读

rwx 含义

字符 含义 数字
r 读(read) 4
w 写(write) 2
x 执行(execute) 1

所以:

  • rwx = 4+2+1 = 7
  • rw- = 4+2+0 = 6
  • r-- = 4+0+0 = 4
  • r-x = 4+0+1 = 5

常用权限数字

数字 权限 说明
755 rwxr-xr-x 所有者可读写执行,其他人可读执行(常用目录、脚本)
644 rw-r--r-- 所有者可读写,其他人只读(常用文件)
700 rwx------ 只有所有者能读写执行(私密文件)
600 rw------- 只有所有者能读写(私密文件)
777 rwxrwxrwx 所有人都能读写执行(不安全,尽量别用)

记住两个最常用的:

  • 目录用 755
  • 文件用 644

chmod 修改权限

数字方式

chmod 755 /var/www/html

把目录权限改成 755。

chmod 644 /var/www/html/index.html

把文件权限改成 644。

递归修改

chmod -R 755 /var/www/html/

把目录下所有文件和子目录都改成 755。

注意: 递归修改的时候要小心,一般文件应该是 644,目录是 755。如果全部改成 755,文件就能执行了,不安全。

字母方式

chmod u+x script.sh

给所有者加执行权限。

chmod g+w file.txt

给所属组加写权限。

chmod o-r file.txt

去掉其他人的读权限。

  • u:所有者
  • g:所属组
  • o:其他人
  • +:加权限
  • -:减权限

chown 修改所有者

修改文件所有者

chown nginx /var/www/html/index.html

把文件所有者改成 nginx。

修改所有者和所属组

chown nginx:nginx /var/www/html/index.html

所有者改成 nginx,所属组也改成 nginx。

递归修改

chown -R nginx:nginx /var/www/html/

把整个目录的所有者和所属组都改成 nginx。

实际应用场景

场景1:Nginx 报 403

Nginx 访问网站报 403 Forbidden,一般是权限不对。

ls -l /var/www/html/index.html

看所有者和权限。如果文件是 root 的,Nginx 进程读不到,就会 403。

chown nginx:nginx /var/www/html/index.html
chmod 644 /var/www/html/index.html

场景2:脚本不能执行

写了个 shell 脚本,运行提示 Permission denied。

chmod +x script.sh

加执行权限就能跑了。

场景3:目录权限不对

网站目录权限不对,上传的图片打不开。

chmod -R 755 /var/www/html/
chown -R nginx:nginx /var/www/html/

常见坑

坑1:chmod 777 解决一切

很多人一遇到权限问题就 chmod 777,这是最懒也最不安全的做法。777 意味着所有人都能读写执行,黑客上传个木马就直接跑了。

正确做法: 文件用 644,目录用 755,所有者设成运行服务的用户。

坑2:只改权限不改所有者

权限对了,但所有者不对,服务还是读不到文件。

解决: 权限和所有者都要对。比如 Nginx 运行用户是 nginx,文件所有者也要是 nginx。

坑3:递归 chmod 把文件也改成 755

chmod -R 755 把所有文件都改成可执行了,不安全。

正确做法: 目录用 755,文件用 644。可以用 find 分开改:

find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

坑4:改了权限不生效

改了权限但还是不对,看看是不是有 SELinux 在捣乱。

解决: 先临时关掉 SELinux 测试:

setenforce 0

如果关了就好了,说明是 SELinux 的问题。

总结

Linux 文件权限核心:

  1. rwx = 4+2+1
  2. 目录用 755,文件用 644
  3. chmod 改权限,chown 改所有者
  4. 不要随便用 777

记住两个最常用的:目录 755,文件 644。遇到权限问题先 ls -l 看看,再改,别上来就 777。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:48 

Linux用户和组管理,useradd和groupadd命令使用

前言

服务器上需要给开发人员开个账号?或者给不同的人分配不同的权限?这就需要用到 Linux 的用户和组管理。Linux 是多用户系统,每个用户有自己的家目录和权限。学会用户和组管理,是运维的基本功。本文就讲一下怎么创建、删除、修改用户和组。

创建用户

基本创建

useradd testuser

这样就创建了一个叫 testuser 的用户。默认会:

  • 创建一个同名的组
  • 创建家目录 /home/testuser
  • 指定 shell 为 /bin/bash

设置密码

passwd testuser

输入两次密码就好了。注意: 新建的用户默认是不能登录的,必须设密码才能登录。

创建用户时指定参数

useradd -m -s /bin/bash -G wheel testuser

参数说明:

  • -m:自动创建家目录
  • -s /bin/bash:指定默认 shell
  • -G wheel:把用户加入 wheel 组(可以用 sudo)

查看用户信息

id testuser

输出用户的 UID、GID、所属组。

cat /etc/passwd

查看所有用户。

删除用户

userdel testuser

这样只删用户,不删家目录。

如果要连家目录一起删:

userdel -r testuser

注意: -r 会把用户的家目录和邮件都删掉,小心操作。

修改用户

修改用户名

usermod -n newname oldname

修改用户的家目录

usermod -d /home/newhome testuser

把用户加入某个组

usermod -aG wheel testuser

-aG 表示追加到组,不要只用 -G,不然会把原来的组都覆盖掉。

锁定用户

usermod -L testuser

锁定后用户不能登录。

解锁用户

usermod -U testuser

组管理

创建组

groupadd developers

删除组

groupdel developers

查看用户属于哪些组

groups testuser

把用户加入组

usermod -aG developers testuser

从组里删除用户

gpasswd -d testuser developers

sudo 权限

把用户加入 wheel 组(CentOS 默认支持 sudo 的组)

usermod -aG wheel testuser

这样 testuser 就可以用 sudo 执行 root 命令了。

编辑 sudoers 文件

visudo

在文件里添加:

testuser ALL=(ALL)       ALL

这样 testuser 也有 sudo 权限。

注意: 一定要用 visudo 编辑,不要直接改 /etc/sudoers,改坏了 sudo 就用不了了。

查看登录历史

谁在线

w

历史登录记录

last

谁在执行 sudo

lastcomm

实际应用场景

场景1:给开发人员开账号

useradd -m -s /bin/bash dev01
passwd dev01
usermod -aG developers dev01

场景2:给运维开 sudo 权限

useradd -m -s /bin/bash ops01
passwd ops01
usermod -aG wheel ops01

场景3:删除离职员工账号

userdel -r olduser

常见坑

坑1:userdel 没加 -r,家目录还在

只删了用户,家目录 /home/testuser 还在,占着磁盘空间。

解决: 删用户的时候加 -r:

userdel -r testuser

坑2:usermod -G 把原来的组覆盖了

用 -G 而不是 -aG,结果用户原来的组都没了,只剩新的组。

解决: 追加组用 -aG:

usermod -aG developers testuser

坑3:新建用户不能登录

创建了用户,但没设密码,结果不能登录。

解决: 创建完用户一定要设密码:

passwd testuser

坑4:visudo 改错了

直接用 vi 改 /etc/sudoers,改错了导致 sudo 用不了。

解决: 一定要用 visudo 命令编辑,它会检查语法。

总结

用户和组管理的核心命令:

  1. useradd:创建用户
  2. passwd:设置密码
  3. userdel -r:删除用户(连家目录)
  4. usermod -aG:把用户加入组
  5. groupadd:创建组
  6. groups:查看用户属于哪些组
  7. visudo:编辑 sudo 权限

用户管理是 Linux 安全的基础,每个用户用自己的账号,不要所有人都用 root。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:47 

Linux查看和修改系统时间,date和timedatectl命令

前言

服务器时间不对?日志时间戳对不上?定时任务不准?这些问题都和系统时间有关。Linux 服务器的时间很重要,日志、定时任务、证书过期时间都依赖系统时间。时间不准会出各种奇怪的问题。本文就讲一下怎么查看和修改 Linux 系统时间,以及怎么设置时区。

查看系统时间

方法一:date 命令

date

输出示例:

Mon Oct  5 10:30:45 CST 2026

CST 就是中国标准时间(China Standard Time)。

方法二:timedatectl 命令(推荐)

timedatectl

输出示例:

               Local time: Mon 2026-10-05 10:30:45 CST
           Universal time: Mon 2026-10-05 02:30:45 UTC
                 RTC time: Mon 2026-10-05 02:30:46
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

这个命令显示的信息更全:本地时间、UTC时间、硬件时间、时区、是否同步、NTP服务状态。

设置时区

查看当前时区

timedatectl

看 Time zone 那行。

查看所有可用时区

timedatectl list-timezones

或者:

ls /usr/share/zoneinfo/

设置时区为上海

timedatectl set-timezone Asia/Shanghai

这是最常用的,国内服务器一般都设成这个。

验证

timedatectl

看 Time zone 那行是不是变成了 Asia/Shanghai。

手动设置时间

不推荐手动设置

一般情况下,时间不准了应该用 NTP 自动同步,不要手动设。手动设的时间过一段时间又会不准。

但如果确实需要手动设:

设置日期和时间

date -s "2026-10-05 10:30:45"

只设置时间

date -s "10:30:45"

只设置日期

date -s "2026-10-05"

NTP 时间同步

安装 NTP 服务

CentOS7 用 chronyd:

yum install chrony -y

启动并设置开机自启

systemctl start chronyd
systemctl enable chronyd

查看同步状态

timedatectl

看 System clock synchronized: yes 就是同步成功了。

手动同步一次

chronyc makestep

常见时间格式

date 命令可以格式化输出:

输出年月日

date +%Y-%m-%d

输出:

2026-10-05

输出时分秒

date +%H:%M:%S

输出完整日期时间

date +"%Y-%m-%d %H:%M:%S"

时间戳

date +%s

输出 Unix 时间戳(秒数)。

从时间戳转换

date -d @1728100000

实际应用场景

场景1:日志时间不对

看日志发现时间戳不对,先查系统时间:

date

如果时间不对,改时区:

timedatectl set-timezone Asia/Shanghai

场景2:定时任务不准

crontab 定时任务执行时间不对,先看系统时间:

date

时间不对就同步 NTP。

场景3:证书过期时间不对

SSL 证书过期时间对不上,也是系统时间的问题。

场景4:脚本里用到时间戳

写脚本的时候需要获取当前时间戳:

now=$(date +%s)

常见坑

坑1:时区不对导致日志时间差8小时

服务器装完默认是 UTC 时区,比北京时间晚8小时。

解决: 设置成上海时区:

timedatectl set-timezone Asia/Shanghai

坑2:改了时间但硬件时间没同步

手动改了系统时间,重启之后又变回去了,因为硬件时间(RTC)没改。

解决: 用 NTP 同步就不用管这个,NTP 会自动同步硬件时间。

坑3:NTP 服务没启动

装了 NTP 但没启动,时间还是不同步。

解决:

systemctl start chronyd
systemctl enable chronyd

坑4:手动设时间后过一会儿又不准了

手动设的时间不准,因为系统时钟会漂移。

解决: 用 NTP 自动同步,不要手动设。

总结

查看和修改系统时间的核心命令:

  1. date:快速看当前时间
  2. timedatectl:看完整时间信息(时区、NTP同步状态)
  3. timedatectl set-timezone Asia/Shanghai:设置时区
  4. chronyd:NTP时间同步服务

服务器时间一定要准,用 NTP 自动同步,不要手动设。国内服务器时区设成 Asia/Shanghai。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:46 

Linux添加Swap交换分区,解决内存不足问题

前言

服务器内存不够用了?MySQL 启动就报内存不足?或者运行着运行着就被 OOM Killer 杀进程了?这时候除了加内存条,还有个应急办法——加 Swap 交换分区。Swap 就是把磁盘的一部分当内存用,虽然慢,但能救急。本文就讲一下怎么在 Linux 下添加 Swap 交换分区。

什么是 Swap

Swap 交换分区,就是把磁盘的一部分空间当作内存来用。当物理内存不够的时候,系统会把不常用的内存数据换到磁盘上,腾出物理内存给正在用的进程。

注意: Swap 只是应急方案,不能当内存用。磁盘比内存慢几百倍,如果频繁使用 Swap,系统会非常卡。

第一步:查看当前 Swap 情况

先看看现在有没有 Swap,多大:

free -h

输出示例:

              total        used        free      shared  buff/cache   available
Mem:          1.8Gi       1.2Gi       200Mi        50Mi       400Mi       300Mi
Swap:            0B          0B          0B

上面的例子里 Swap 是 0B,说明没有配置 Swap。

也可以看:

swapon -s

第二步:创建 Swap 文件

我们用文件的方式创建 Swap,比分区方式灵活,随时可以删。

1. 创建一个 2G 的 Swap 文件

dd if=/dev/zero of=/swapfile bs=1M count=2048

参数说明:

  • if=/dev/zero:输入源,零设备
  • of=/swapfile:输出文件
  • bs=1M:块大小1M
  • count=2048:2048块,也就是2G

2. 设置文件权限

chmod 600 /swapfile

必须设置成 600,不然系统不认。

3. 格式化成 Swap

mkswap /swapfile

输出会显示:

Setting up swapspace version 1, size = 2097151 KiB
no label, UUID=xxxx-xxxx

第三步:启用 Swap

swapon /swapfile

查看是否启用成功:

free -h

现在应该能看到 Swap 那行有数值了。

第四步:配置开机自动挂载

写入 /etc/fstab,重启后自动启用。

vi /etc/fstab

在最后一行添加:

/swapfile swap swap defaults 0 0

第五步:调整 Swap 使用优先级

Linux 默认是尽量用物理内存,Swap 只用在内存不够的时候。这个策略一般不用改。

如果想调整 Swap 的使用倾向,可以改 /etc/sysctl.conf:

vm.swappiness = 10

swappiness 值范围是 0~100:

  • 0:尽量不用 Swap
  • 100:积极使用 Swap
  • 10:推荐值,内存不够才用 Swap

改完执行:

sysctl -p

常见操作

查看 Swap 使用情况

swapon -s

关闭 Swap

swapoff /swapfile

删除 Swap

swapoff /swapfile
rm /swapfile

然后把 /etc/fstab 里那行也删掉。

实际应用场景

场景1:MySQL 启动报内存不足

MySQL 启动的时候需要加载很多数据到内存,如果内存不够会直接启动失败。加个 Swap 就能启动了。

场景2:临时跑大任务

有时候要临时跑个大任务,内存不够,加个 Swap 救急。

场景3:防止 OOM Killer 杀进程

内存不够的时候,系统会用 OOM Killer 杀掉占内存最多的进程。加个 Swap 能缓冲一下,避免直接被杀。

常见坑

坑1:Swap 文件权限不对

创建完 Swap 文件之后忘了 chmod 600,结果 swapon 报错。

解决: 一定要先设置权限:

chmod 600 /swapfile

坑2:/etc/fstab 写错了

和挂载硬盘一样,/etc/fstab 写错了重启会进不去系统。

解决: 改完先执行 swapon -a 测试一下。

坑3:Swap 太大了影响性能

Swap 不是越大越好。如果 Swap 用得很频繁,系统会非常卡,因为磁盘比内存慢几百倍。

建议: Swap 大小设成物理内存的 0.5~2 倍就够了。比如 2G 内存,Swap 设 2~4G 就行。

坑4:SSD 上放 Swap 还好,机械硬盘上放 Swap 很卡

如果是机械硬盘,频繁读写 Swap 会非常卡。SSD 还好一点。

总结

添加 Swap 的完整流程:

  1. dd 创建 Swap 文件
  2. chmod 600 设置权限
  3. mkswap 格式化
  4. swapon 启用
  5. 写 /etc/fstab 开机自动挂载
  6. 调整 swappiness 优先级

Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:44 

Linux添加新硬盘并挂载,fdisk和mkfs分区格式化

前言

服务器磁盘满了,加了一块新硬盘,但不知道怎么用?新硬盘插上去之后,Linux 是不能直接用的,需要先分区、格式化、挂载,最后还要配置开机自动挂载。整个流程看起来复杂,其实就几步。本文就以 CentOS7 为例,完整讲一下新硬盘从插入到挂载的全过程。

第一步:查看新硬盘有没有识别到

加完硬盘之后,先看看系统有没有识别到。

fdisk -l

输出会列出所有磁盘设备。一般系统盘是 /dev/sda,新硬盘就是 /dev/sdb、/dev/sdc 这样。

找到新硬盘,大小和你加的硬盘一致的那个就是。比如新硬盘是100G,找大小100G的那个设备。

注意: 千万别搞错设备名!格式化错了盘,数据就全没了。一定要确认大小对得上。

第二步:给新硬盘分区

用 fdisk 命令给新硬盘分区。这里我们分一个主分区,用完全部空间。

fdisk /dev/sdb

进入 fdisk 交互界面,按以下步骤操作:

1. 输入 n 创建新分区

Command (m for help): n

2. 选择主分区

Select (default p): p

3. 分区号选默认1

Partition number (1-4, default 1): 1

4. 起始扇区选默认

直接回车:

First sector (2048-209715199, default 2048): 回车

5. 结束扇区选默认(用完全部空间)

直接回车:

Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): 回车

6. 输入 w 保存退出

Command (m for help): w

这样就分好区了,分区设备是 /dev/sdb1。

第三步:格式化分区

分完区之后,需要格式化成文件系统。一般用 ext4 或 xfs。

CentOS7 默认用 xfs:

mkfs.xfs /dev/sdb1

如果要用 ext4:

mkfs.ext4 /dev/sdb1

等待格式化完成,一般很快,几十秒就好。

第四步:创建挂载目录

先创建一个目录用来挂载新硬盘:

mkdir /data

第五步:挂载分区

把分区挂载到刚才创建的目录:

mount /dev/sdb1 /data

查看挂载结果:

df -h

输出里应该能看到 /dev/sdb1 挂载在 /data 目录。

第六步:配置开机自动挂载

上面的挂载重启之后就没了,需要写入 /etc/fstab 才能开机自动挂载。

1. 查看分区的 UUID

blkid /dev/sdb1

输出示例:

/dev/sdb1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="xfs"

复制这个 UUID。

2. 编辑 /etc/fstab

vi /etc/fstab

在最后一行添加:

UUID=刚才复制的UUID /data xfs defaults 0 0

各字段含义:

  • 第一列:设备UUID
  • 第二列:挂载点
  • 第三列:文件系统类型(xfs 或 ext4)
  • 第四列:挂载参数(defaults 就够了)
  • 第五列:dump备份标记(0表示不备份)
  • 第六列:开机检查顺序(0表示不检查)

3. 测试配置是否正确

mount -a

如果没有报错,说明配置正确。如果报错了,千万别重启!重启可能进不去系统。

常见坑

坑1:格式化错了盘

这是最危险的坑!格式化错了盘,数据就全没了。

解决: 格式化之前一定要确认设备名是对的,用 fdisk -l 看大小,确认大小和你加的新硬盘一致再操作。

坑2:/etc/fstab 写错了,重启进不去系统

如果 /etc/fstab 写错了,重启的时候会卡在挂载界面,进不去系统。

解决: 改完 /etc/fstab 之后一定要先跑 mount -a 测试,确认没报错再重启。

坑3:挂载目录里有文件

如果挂载目录里已经有文件了,挂载之后原来的文件就看不到了(不是删了,是被覆盖了)。

解决: 挂载之前确认挂载目录是空的,或者先把原来的文件移走。

坑4:用设备名写 fstab,重启后变了

如果用 /dev/sdb1 写 fstab,下次重启之后硬盘顺序变了,可能就挂载错了。

解决: 用 UUID 写 fstab,UUID 是唯一的,不会变。

总结

新硬盘挂载的完整流程:

  1. fdisk -l:确认新硬盘设备名
  2. fdisk /dev/sdb:分区
  3. mkfs.xfs /dev/sdb1:格式化
  4. mkdir /data:创建挂载目录
  5. mount /dev/sdb1 /data:临时挂载
  6. blkid 查UUID:获取UUID
  7. 写 /etc/fstab:配置开机自动挂载
  8. mount -a:测试配置

整个流程走一遍以后,加硬盘就是熟练活了。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:43 

Linux查看系统版本和内核信息,cat /etc/os-release和uname命令

前言

刚拿到一台服务器,第一步就是看看是什么系统、什么版本、内核是多少。不同的系统版本配置方法不一样,CentOS7 和 CentOS8 的防火墙命令都不一样,Ubuntu 和 CentOS 的包管理器也不一样。所以第一件事就是确认系统版本。本文就讲一下怎么查看 Linux 系统版本和内核信息。

查看系统版本

方法一:cat /etc/os-release(推荐)

这是最通用的方法,所有现代 Linux 发行版都有这个文件:

cat /etc/os-release

CentOS7 输出示例:

NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

Ubuntu 输出示例:

NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"

重点看 NAME、VERSION、VERSION_ID 这几行。

方法二:cat /etc/redhat-release(CentOS/RHEL专用)

CentOS 和 RHEL 系统可以直接看这个文件:

cat /etc/redhat-release

输出:

CentOS Linux release 7.9.2009 (Core)

方法三:lsb_release -a

lsb_release -a

输出:

Distributor ID: CentOS
Description:    CentOS Linux release 7.9.2009 (Core)
Release:        7.9.2009
Codename:       Core

注意: 有些系统默认没装 lsb_release,需要先安装:

yum install redhat-lsb -y

方法四:hostnamectl

hostnamectl

输出会显示系统信息,包括操作系统和内核版本:

   Static hostname: localhost.localdomain
         Icon name: computer-vm
           Chassis: vm
        Machine ID: xxxxxxxx
           Boot ID: xxxxxxxx
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.el7.x86_64
      Architecture: x86-64

这个命令同时显示系统版本和内核版本,很方便。

查看内核版本

方法一:uname -a(最常用)

uname -a

输出示例:

Linux localhost 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:58 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

各段含义:

  • Linux:内核名
  • localhost:主机名
  • 3.10.0-1160.el7.x86_64:内核版本
  • #1 SMP ...:编译信息
  • x86_64 x86_64 x86_64:硬件架构、处理器类型、操作系统类型

方法二:uname -r

只看内核版本号:

uname -r

输出:

3.10.0-1160.el7.x86_64

内核版本号拆解:

  • 3:主版本
  • 10:次版本
  • 0:修订版本
  • 1160:RHEL补丁号
  • el7:Enterprise Linux 7
  • x86_64:64位

方法三:cat /proc/version

cat /proc/version

输出:

Linux version 3.10.0-1160.el7.x86_64 (mockbuild@x86-01.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Mon Oct 19 16:18:58 UTC 2020

查看系统架构

uname -m

输出:

x86_64

说明是64位系统。如果输出 i686 就是32位。

或者用:

arch

实际应用场景

场景1:刚拿到服务器,先确认系统版本

cat /etc/os-release
uname -r

确认是 CentOS7 还是 Ubuntu,内核版本是多少。

场景2:安装软件前确认版本

不同版本的系统安装方法不一样,CentOS7 用 yum,Ubuntu 用 apt。先确认版本再装软件。

场景3:排查内核兼容性问题

有些软件要求特定内核版本,先看看当前内核版本够不够。

uname -r

场景4:确认是32位还是64位

uname -m

常见坑

坑1:cat /etc/issue 不准

很多老教程说用 cat /etc/issue 看系统版本,但这个文件可能被改过,不一定准。推荐用 /etc/os-release。

坑2:把内核版本和系统版本搞混

内核版本是 uname -r 显示的,系统版本是 /etc/os-release 显示的。这两个不一样,别搞混了。

坑3:CentOS 各小版本不影响大版本

CentOS7.9 和 CentOS7.6 都是 CentOS7,大部分操作是一样的。只要大版本对就行,不用纠结小版本号。

总结

查看系统版本和内核信息的核心命令:

  1. cat /etc/os-release:看系统版本(最通用)
  2. cat /etc/redhat-release:CentOS/RHEL 专用
  3. uname -a:看内核版本和系统架构
  4. uname -r:只看内核版本号
  5. hostnamectl:同时看系统版本和内核版本

拿到一台新服务器,先跑这几个命令确认系统环境,再开始做其他操作。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:42 

Linux查看进程启动时间,ps和lsof命令使用

前言

想知道某个进程跑了多久?或者想知道哪个进程打开了某个文件?这时候就需要用到 ps 和 lsof 两个命令了。ps 用来查看进程信息,包括启动时间、运行状态等;lsof 用来查看进程打开了哪些文件。这两个命令是运维排查问题的必备工具。本文就详细讲一下这两个命令的使用。

ps 命令

基本用法

ps aux

输出所有进程的详细信息。

输出示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1 128000  5000 ?        Ss   Oct01   0:05 /usr/lib/systemd/systemd
root      123  0.0  0.2 150000 10000 ?        Ss   Oct01   0:10 /usr/sbin/sshd
nginx    4567  0.0  0.3 200000 15000 ?        S    Oct05   0:02 nginx: worker process

各列含义

列 含义
USER 进程所属用户
PID 进程ID
%CPU CPU占用百分比
%MEM 内存占用百分比
VSZ 虚拟内存大小
RSS 物理内存大小
TTY 终端
STAT 进程状态
START 启动时间
TIME 累计CPU时间
COMMAND 启动命令

查看进程启动时间

ps -p PID -o lstart

比如查看PID为123的进程的启动时间:

ps -p 123 -o lstart

输出:

STARTED
Mon Oct  1 10:30:45 2026

查看某个进程的详细信息

ps aux | grep nginx

按CPU占用排序

ps aux --sort=-%cpu | head -10

按内存占用排序

ps aux --sort=-%mem | head -10

lsof 命令

lsof = list open files,用来查看进程打开了哪些文件。

基本用法

lsof

列出所有进程打开的所有文件。

查看某个进程打开的文件

lsof -p PID

比如查看PID为123的进程打开了哪些文件:

lsof -p 123

查看某个文件被哪个进程占用

lsof 文件路径

比如查看 /var/log/nginx/access.log 被哪个进程占用:

lsof /var/log/nginx/access.log

查看某个端口被哪个进程占用

lsof -i :80

查看80端口被哪个进程占用。

查看某个用户打开的文件

lsof -u nginx

查看nginx用户打开的所有文件。

查看某个目录下被打开的文件

lsof +D /var/log/

查看 /var/log/ 目录下所有被打开的文件。

实际排查案例

案例1:磁盘空间没释放

删了一个大文件,但磁盘空间没释放。这是因为还有进程在写这个文件。

lsof | grep deleted

输出所有已删除但还被进程占用的文件。找到对应的PID,重启那个进程就能释放空间了。

案例2:端口被占用

启动Nginx的时候报错"Address already in use",说明80端口被占用了。

lsof -i :80

看是哪个进程占了80端口,杀掉或者换个端口。

案例3:进程启动时间不对

怀疑某个服务被重启过,看看启动时间。

ps -ef | grep nginx

或者更详细的:

ps -p PID -o lstart

案例4:找出谁在写日志

想知道哪个进程在写某个日志文件。

lsof /var/log/messages

常见坑

坑1:删了文件磁盘空间没释放

这是最常见的坑。删了大文件,但磁盘空间没释放,因为还有进程在写这个文件。

解决: 用 lsof | grep deleted 找到还在写这个文件的进程,重启那个进程,或者直接清空文件内容:

> /var/log/nginx/access.log

坑2:ps aux 和 ps -ef 搞混了

ps aux 和 ps -ef 输出格式不一样,但信息基本一样。aux 是BSD格式,-ef 是System V格式。看个人习惯。

坑3:lsof 输出太多

lsof 不加参数会输出一大堆,根本看不过来。一定要加参数过滤:-p、-i、-u、+D 等。

总结

查看进程信息的核心命令:

  1. ps aux:看所有进程的基本信息
  2. ps -p PID -o lstart:看某个进程的启动时间
  3. lsof -p PID:看某个进程打开了哪些文件
  4. lsof -i :端口:看某个端口被哪个进程占用
  5. lsof | grep deleted:看哪些已删除文件还被进程占用

ps 和 lsof 是运维排查问题的基本功,遇到问题先跑一遍这两个命令,大部分问题都能定位到方向。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:40 

Linux查看网络连接数,ss和netstat命令统计

前言

服务器被攻击了?网站访问量突然暴涨?想看看当前有多少人在连接你的服务器?这时候就需要查看网络连接数了。ss 和 netstat 是两个最常用的网络连接查看命令,ss 是新版,速度更快,推荐优先用。本文就讲一下怎么用这两个命令统计网络连接数、排查网络问题。

ss 命令(推荐)

ss 是 iproute2 包自带的,比 netstat 快很多,尤其是连接数很多的时候。

基本用法

ss

显示所有TCP和UDP连接。

统计各状态连接数

ss -s

输出示例:

Total: 120
TCP:   80 (estab 30, closed 40, orphaned 0, timewait 20)

Transport Total     IP        IPv6
RAW       0         0         0
UDP       5         3         2
TCP       80        60        20
INET      85        63        22
FRAG      0         0         0

这就是全局统计,一眼就能看出当前有多少连接。

查看TCP连接

ss -t

只显示TCP连接。

查看所有监听端口

ss -tlnp

参数说明:

  • -t:TCP
  • -l:只显示监听状态的
  • -n:不解析域名,直接显示IP和端口
  • -p:显示进程名

统计某个端口的连接数

比如统计80端口的连接数:

ss -tn | grep :80 | wc -l

统计各状态的TCP连接数

ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

输出示例:

40 ESTAB
30 TIME-WAIT
10 LISTEN
5 CLOSE-WAIT

netstat 命令

netstat 是老牌命令,很多老脚本还在用。

基本用法

netstat -tlnp

查看监听的TCP端口。

统计各状态连接数

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

统计某个端口的连接数

netstat -an | grep :80 | wc -l

查看哪个进程在监听某个端口

netstat -tlnp | grep :80

连接状态详解

TCP连接有很多状态,常见的:

状态 含义
ESTABLISHED 已建立连接,正在通信
LISTEN 监听中,等待连接
TIME_WAIT 主动关闭方等待,防止旧包干扰新连接
CLOSE_WAIT 被动关闭方等待,说明程序没正确关闭连接
FIN_WAIT1 主动关闭方,等待对方回应
FIN_WAIT2 主动关闭方,已经收到对方回应

重点关注:

  • ESTABLISHED 多:说明当前活跃连接多,正常
  • TIME_WAIT 多:说明短连接很多,正常但要注意
  • CLOSE_WAIT 多:说明程序有bug,没正确关闭连接

实际排查案例

案例1:看看当前有多少人访问网站

ss -tn | grep :80 | grep ESTAB | wc -l

统计80端口已建立连接的数量。

案例2:看看哪个IP连接最多

ss -tn state established '( sport = :80 )' | awk '{print $4}' | awk -F: '{print $1}' | sort | uniq -c | sort -rn | head -10

输出连接最多的前10个IP。

案例3:看看是不是被攻击了

如果突然有大量 TIME_WAIT 或 CLOSE_WAIT,可能是被攻击了。

ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn

常见坑

坑1:连接数多就是被攻击了

连接数多不一定是被攻击。如果是正常的网站访问量上涨,连接数多是正常的。要看连接来源IP分布和连接状态。

坑2:TIME_WAIT 多就优化

TIME_WAIT 是TCP协议的正常机制,不需要太紧张。除非 TIME_WAIT 数量特别多(几万几十万),影响了性能,再考虑优化。

坑3:CLOSE_WAIT 多不处理

CLOSE_WAIT 多说明你的程序有bug,没有正确关闭连接。时间长了会把文件句柄用完,导致新连接建不起来。这是程序问题,要改代码。

总结

查看网络连接数的核心命令:

  1. ss -s:快速看全局统计
  2. ss -tlnp:看监听端口和对应进程
  3. ss -tan | awk '{print $1}' | sort | uniq -c:统计各状态连接数
  4. netstat:老命令,兼容性好,但慢

推荐用 ss,比 netstat 快很多,尤其是连接数很多的时候。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:39 

Linux查看磁盘I/O性能,iostat命令详解

前言

服务器变慢了,CPU不高、内存也够,但就是卡。这时候就要看看是不是磁盘I/O瓶颈了。很多时候系统慢不是CPU不够,而是磁盘读写太慢,CPU一直在等磁盘。iostat 就是专门用来查看磁盘I/O性能的工具,配合 vmstat 一起用,能快速定位I/O问题。本文就详细讲一下 iostat 命令的使用。

安装 iostat

CentOS7 默认可能没装 iostat,先装一下:

yum install sysstat -y

iostat 属于 sysstat 包,装完就有了。

基本用法

直接输入:

iostat

输出示例:

Linux 3.10.0-1160.el7.x86_64 (localhost)    10/05/2026  _x86_64_    (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.00    0.00    2.00    1.00    0.00   92.00

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               10.00        50.00       100.00     500000     1000000

输出详解

CPU 部分

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.00    0.00    2.00    1.00    0.00   92.00
列 含义
%user 用户态CPU占用
%nice 改变过优先级的进程占用
%system 内核态CPU占用
%iowait 等待磁盘I/O的CPU占比(重点看这个)
%steal 被虚拟机偷走的CPU
%idle 空闲CPU

重点看 %iowait: 如果这个值很高(比如超过20%),说明磁盘I/O是瓶颈,CPU大部分时间在等磁盘读写。

磁盘部分

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               10.00        50.00       100.00     500000     1000000
列 含义
Device 设备名
tps 每秒传输次数(IOPS)
kB_read/s 每秒读取的数据量
kB_wrtn/s 每秒写入的数据量
kB_read 总共读取的数据量
kB_wrtn 总共写入的数据量

实时监控

每2秒刷新一次

iostat 2

按 Ctrl+C 退出。

每2秒刷新一次,总共刷新5次

iostat 2 5

只看磁盘部分,不看CPU

iostat -d 2

更详细的磁盘统计

显示扩展统计信息

iostat -x

输出会多出很多列,这才是真正分析磁盘性能的关键:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda              0.00     5.00    1.00    9.00    50.00   100.00    30.00     0.10    5.00    2.00    6.00   1.00   1.00

重点列说明:

列 含义 判断标准
await 平均I/O等待时间(毫秒) 超过20ms就要注意,超过100ms说明磁盘很慢
svctm 平均I/O服务时间(毫秒) 越小越好
%util 磁盘利用率 接近100%说明磁盘跑满了
avgqu-sz 平均I/O队列长度 越大说明排队越严重

最重要的两个指标:

  1. %util:如果接近100%,说明磁盘已经跑满了
  2. await:如果很大,说明每次I/O等待时间很长,磁盘很慢

常用参数组合

实时监控磁盘性能

iostat -x 2

每2秒刷新一次,显示扩展信息。

只看某个磁盘

iostat -x sda 2

以MB为单位显示

iostat -m

显示设备映射关系

iostat -N

实际排查案例

案例1:系统变慢,怀疑磁盘I/O

vmstat 1

看 wa 列,如果很高(超过20%),说明磁盘I/O是瓶颈。

然后用 iostat 详细看:

iostat -x 2

看 %util 是不是接近100%,await 是不是很大。

案例2:哪个磁盘跑得最忙

iostat -x 2

看 %util 列,哪个磁盘的 %util 最高,就是哪个磁盘是瓶颈。

案例3:读写比例

iostat -x 2

看 r/s 和 w/s,是读多还是写多,针对性优化。

常见坑

坑1:%util 100% 就以为磁盘坏了

%util 100% 说明磁盘在处理I/O请求,但不一定是磁盘性能不行。可能是I/O请求量太大,也可能是磁盘确实慢。要结合 await 一起看。

坑2:只看 tps 不看 await

tps 高不一定是问题,要看每次I/O的等待时间 await。如果 await 很小,说明磁盘处理得很快,tps高也没关系。

坑3:把 iowait 当成CPU问题

%iowait 高说明CPU在等磁盘,不是CPU不够用。这时候加CPU没用,要优化磁盘I/O。

总结

查看磁盘I/O性能的核心命令:

  1. iostat:快速看磁盘整体读写情况
  2. iostat -x 2:实时监控,重点看 %util 和 await
  3. vmstat 1:看 wa 列,确认是不是I/O瓶颈

记住两个关键指标:

  • %util 接近100%:磁盘跑满了
  • await 超过20ms:磁盘响应慢了

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:37 

Linux查看内存使用情况,free和vmstat命令详解

前言

服务器卡了,第一反应就是看看内存够不够用。很多人一看到 free 很少就慌了,觉得内存不够要扩容。其实 Linux 的内存管理和 Windows 不一样,free 少不代表内存真的不够。本文就讲一下怎么用 free 和 vmstat 两个命令正确查看内存使用情况。

free 命令

基本用法

直接输入:

free

输出示例:

              total        used        free      shared  buff/cache   available
Mem:        8165036     4000000     2000000       50000     2165036     4000000
Swap:       2097148           0     2097148

输出详解

列 含义
total 总内存大小
used 已使用的内存
free 完全空闲的内存
shared 共享内存
buff/cache 缓存和缓冲区占用的内存
available 真正可用的内存(重点看这列)

重点:available 才是真正可用的内存

很多人只看 free 列,看到只剩几百M就慌了。其实 Linux 会把空闲内存都用来做缓存(buff/cache),这些缓存是可以随时回收的。

看 available 列才是真正可用的内存。 比如上面的例子,free 只有2G,但 available 有4G,说明还有4G内存可以用。

free 常用参数

free -h

以人类可读的格式显示(自动用G/M/K单位):

              total        used        free      shared  buff/cache   available
Mem:           7.8Gi       3.8Gi       1.9Gi        50Mi       2.1Gi       3.8Gi
Swap:          2.0Gi          0B       2.0Gi
free -m

以MB为单位显示。

free -g

以GB为单位显示。

free -s 5

每5秒刷新一次。

free -c 3

总共显示3次后退出。

vmstat 命令

基本用法

直接输入:

vmstat

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 2000000  50000 2100000    0    0    10    20   100   50  5  2 92  1  0

输出详解

procs 进程部分:

  • r:等待运行的进程数
  • b:处于不可中断睡眠的进程数

memory 内存部分:

  • swpd:已用的交换分区大小
  • free:空闲内存
  • buff:缓冲区大小
  • cache:缓存大小

swap 交换分区部分:

  • si:从磁盘交换到内存的速度(KB/s)
  • so:从内存交换到磁盘的速度(KB/s)

io 磁盘I/O部分:

  • bi:从磁盘读取的速度(块/s)
  • bo:写入磁盘的速度(块/s)

cpu CPU部分:

  • us:用户态CPU占用
  • sy:内核态CPU占用
  • id:空闲CPU
  • wa:等待I/O的CPU
  • st:被虚拟机偷走的CPU

vmstat 常用参数

vmstat 1

每秒刷新一次,按 Ctrl+C 退出。

vmstat 1 5

每秒刷新一次,总共刷新5次。

vmstat -s

显示内存统计信息。

怎么判断内存够不够用

看 available 够不够

free -h

看 available 列,如果 available 还有几百M以上,说明内存够用。

看 swap 用了多少

free -h

如果 Swap 的 used 列有数值,说明物理内存不够用了,系统在把内存数据换到磁盘上。这时候性能会大幅下降。

看 si 和 so

vmstat 1

如果 si 和 so 列长期不为0,说明系统在频繁换页,内存不够用了。

实际排查案例

案例1:内存够不够

free -h

看 available 列,如果还有几个G,说明内存够用。

案例2:系统变慢,怀疑内存不足

vmstat 1

看 si 和 so 是不是很高,如果很高说明在频繁换页,内存不够。

案例3:哪个进程占内存最多

top

按 M 键按内存排序,看哪个进程占的内存最多。

常见坑

坑1:把 free 少当成内存不足

Linux 的内存管理机制和 Windows 不一样,空闲内存都用来做缓存了,buff/cache 那部分是可以随时回收的。看 available 列才是真正可用的内存。

坑2:看到 swap 用了就慌

如果 swap 用了一点,但 si 和 so 都是0,说明那是历史遗留的,不影响性能。只有当 si 和 so 长期不为0的时候才是问题。

坑3:内存不够就随便扩容

内存不够的原因可能有很多:

  • 某个程序内存泄漏
  • 数据库缓存配置太大
  • 日志缓存没配置

先找出原因,再决定要不要扩容。

总结

查看内存使用情况的核心命令:

  1. free -h:快速看内存总览,重点看 available 列
  2. vmstat 1:实时监控内存和换页情况,看 si 和 so
  3. top 按M:看哪个进程占内存最多

记住一个原则:Linux 的 free 少不是问题,available 少才是问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:36 

Linux查看系统运行时间,uptime和w命令使用

前言

想知道服务器已经连续运行了多少天?现在有多少人在线?系统负载怎么样?这些问题用 uptime 和 w 两个命令就能搞定。这两个命令虽然简单,但都是运维日常最常用的,一个看运行时间和负载,一个看谁在线。本文就把这两个命令讲透。

uptime 命令

基本用法

直接输入:

uptime

输出示例:

 10:30:45 up 30 days,  2:15,  1 user,  load average: 0.50, 0.40, 0.30

输出详解

字段 含义
10:30:45 当前系统时间
up 30 days, 2:15 系统已运行30天2小时15分钟
1 user 当前有1个用户登录
load average: 0.50, 0.40, 0.30 系统负载,分别是1分钟、5分钟、15分钟的平均值

负载怎么看

负载(load average)是衡量系统繁忙程度的指标。数值越高说明越忙。

判断标准:

  • 负载数值和CPU核心数有关
  • 比如4核CPU,负载4.0才算跑满
  • 一般来说,负载不要超过CPU核心数的70%
  • 比如4核CPU,负载在2.8以下算正常

uptime 常用参数

uptime -V

查看版本号。

uptime -h

查看帮助。

w 命令

基本用法

直接输入:

w

输出示例:

 10:30:45 up 30 days,  2:15,  1 user,  load average: 0.50, 0.40, 0.30
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.1.100    10:20    5.00s  0.05s  0.00s w

输出详解

第一行和 uptime 完全一样:系统时间、运行时间、在线用户数、负载。

下面是当前登录的用户列表:

列 含义
USER 登录用户名
TTY 终端类型(pts/0 表示远程SSH连接)
FROM 登录来源IP
LOGIN@ 登录时间
IDLE 空闲时间
JCPU 该终端所有进程占用的CPU时间
PCPU 当前进程占用的CPU时间
WHAT 当前正在运行的命令

w 常用参数

w -h

不显示第一行标题,只显示用户列表。

w -s

精简模式,不显示 JCPU 和 PCPU 列。

w root

只查看某个用户的登录信息。

who 命令

除了 uptime 和 w,还有个 who 命令,更简单:

who

输出:

root     pts/0        2026-10-05 10:20 (192.168.1.100)

只显示谁在线、从哪来、什么时候登录的。

last 命令

想知道历史登录记录,用 last:

last

输出最近的登录记录,包括:

  • 谁登录的
  • 从哪个IP登录的
  • 什么时候登录的
  • 登录了多久
last -10

只看最近10条。

实际应用场景

场景1:服务器重启过没有

用 uptime 看运行时间,如果才几天,说明最近重启过。

uptime

场景2:谁在登录我的服务器

用 w 看当前有谁在线,来源IP是哪里。如果有不认识的IP,可能是被入侵了。

w

场景3:系统负载高不高

用 uptime 看 load average,如果负载很高,再用 top 看是哪个进程占的。

uptime
top

场景4:排查登录历史

用 last 看历史登录记录,有没有异常登录。

last

常见坑

坑1:负载高就以为CPU不够

负载高不一定是CPU的问题。负载包括所有等待CPU的进程,也包括等待I/O的进程。可能是磁盘I/O瓶颈,也可能是大量进程在排队。要结合 top 一起看。

坑2:把在线用户数看得很重要

1 user 这个数字只是当前登录的用户数,不代表系统性能。一个用户也可能把系统跑满,100个用户也可能很空闲。

坑3:last 显示的是历史记录,不是实时状态

last 是看历史登录记录的,现在谁在线要用 w 或 who。两者别搞混了。

总结

uptime 和 w 是最基础的系统监控命令:

  1. uptime:看系统运行时间和负载
  2. w:看谁在线、从哪来、在干嘛
  3. who:更简单的在线用户查看
  4. last:看历史登录记录

这几个命令都是秒出结果,排查问题的时候先跑一遍,快速了解系统基本状态。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:35 
'); })();