Linux 查看进程资源占用常见问题汇总(建议收藏) Linux

面试中经常被问到的查看进程资源占用,你真的掌握了吗?本文结合实例,讲解Linux中查看进程资源占用的正确用法。


emer 发布于  2026-10-29 07:04 

Linux 编写systemd服务文件案例讲解(2026最新整理) Linux

面试中经常被问到的编写systemd服务文件,你真的掌握了吗?本文结合实例,讲解Linux中编写systemd服务文件的正确用法。


emer 发布于  2026-10-29 07:03 

Linux 修改SSH默认端口最佳实践(附代码示例) Linux

修改SSH默认端口是Linux开发者必须掌握的基础技能之一。掌握它不仅能提升开发效率,还能避免很多隐蔽的 Bug。


emer 发布于  2026-10-29 07:02 

Linux 时区与时间同步案例讲解(附代码示例) Linux

面试中经常被问到的时区与时间同步,你真的掌握了吗?本文结合实例,讲解Linux中时区与时间同步的正确用法。


emer 发布于  2026-10-28 06:52 

Linux 配置环境变量快速上手指南(建议收藏) Linux

熟练掌握配置环境变量,是写好Linux代码的基本功。本文循序渐进,从概念到示例一次讲透。


emer 发布于  2026-10-28 06:51 

Linux 查找命令安装路径核心用法解析 Linux

同样是查找命令安装路径,不同的实现方式在性能和可维护性上差别很大。本文对比几种常见写法,并给出推荐方案。


emer 发布于  2026-10-28 06:51 

Linux压缩解压命令大全,tar、zip、unzip用法 Linux

前言

服务器上打包备份、上传下载源码、解压第三方软件,都离不开压缩解压命令。Linux 常用两套工具:tar(配合 gzip/bzip2/xz,后缀 .tar.gz、.tar.bz2、.tar.xz)和 zip/unzip(后缀 .zip,与 Windows 互通方便)。本篇按场景汇总最常用命令,记住几个核心参数即可覆盖日常运维。

一、tar 核心参数记忆

  • c:创建打包(create)
  • x:解包(extract)
  • t:查看包内容不解压(list)
  • v:显示过程(verbose)
  • f:指定文件名(file,必须放最后)
  • z:gzip 压缩(.tar.gz)
  • j:bzip2 压缩(.tar.bz2)
  • J:xz 压缩(.tar.xz)
  • -C 目录:解压到指定目录
  • --exclude=路径:打包时排除某些目录

二、tar 打包压缩常用命令

# 1. 打包并用 gzip 压缩目录(最常用)
tar -zcvf backup.tar.gz /var/www/html

# 2. bzip2 压缩(压缩率更高,速度慢)
tar -jcvf backup.tar.bz2 /var/www/html

# 3. xz 压缩(压缩率最高,速度最慢)
tar -Jcvf backup.tar.xz /var/www/html

# 4. 打包时排除缓存目录
tar -zcvf site.tar.gz /var/www/html --exclude=/var/www/html/cache --exclude=/var/www/html/logs

# 5. 查看压缩包内容(不解压)
tar -ztvf backup.tar.gz

三、tar 解压常用命令

# 解压 .tar.gz 到当前目录
tar -zxvf backup.tar.gz

# 解压到指定目录(目录需先存在)
mkdir -p /data/restore
tar -zxvf backup.tar.gz -C /data/restore

# .tar.bz2 解压
tar -jxvf backup.tar.bz2

# .tar.xz 解压
tar -Jxvf backup.tar.xz

# 只解压包内某个文件
tar -zxvf backup.tar.gz ./www/config.php

tar 会自动识别压缩格式,日常也可直接用 tar -xvf backup.tar.gz,省略 z/j/J。

四、zip 与 unzip

# 安装(最小化系统可能缺失)
yum install -y zip unzip

# 压缩目录为 zip
zip -r site.zip /var/www/html

# 压缩时排除某些文件
zip -r site.zip /var/www/html -x "*/cache/*" "*.log"

# 解压 zip 到当前目录
unzip site.zip

# 解压到指定目录
unzip site.zip -d /data/restore

# 查看 zip 内容
unzip -l site.zip

# 解压时覆盖已存在文件(不询问)
unzip -o site.zip

参数:-r 递归打包目录,-d 指定解压目录,-o 强制覆盖,-l 列出内容。

五、gzip / gunzip 单文件压缩

# 压缩单个文件(原文件被替换为 .gz)
gzip messages

# 解压
gunzip messages.gz
# 等价于
gzip -d messages.gz

# 保留原文件压缩
gzip -k messages

六、常见坑

  1. f 参数位置错:tar -zcvf 文件名 中 f 必须紧跟文件名,放最前面会报错;
  2. 打包用绝对路径:tar -zcvf a.tar.gz /var/www 解压时会还原完整路径;建议先 cd /var 再打包 www,或用相对路径;
  3. 解压目录不存在:-C 指定的目标目录要先 mkdir -p,否则解压失败;
  4. zip 忘记 -r:只打包了目录本身,里面文件没进去;
  5. .tar.gz 当成 .zip 解压:先 file 文件名 或 tar -ztvf 确认格式;
  6. 中文文件名乱码:unzip 加 -O CP936(老版本)或 -O gbk,解压 Windows 带来的 zip;
  7. 大文件打包占满磁盘:先确认目标分区剩余空间,备份包不要和源目录放同一分区。

七、备份场景示例

# 打包网站源码并按日期命名
tar -zcvf /backup/site_$(date +%Y%m%d).tar.gz -C /var www

# 打包数据库导出文件
mysqldump -u root -p dbname > db.sql
gzip db.sql

总结

日常备份优先 tar -zcvf 包名.tar.gz 目录,解压 tar -zxvf 包名.tar.gz;与 Windows 互通用 zip -r / unzip;f 参数紧跟文件名,解压前先确认格式和目标目录,打包大目录时注意磁盘空间和路径写法。

遇到问题加QQ23979811 协助处理


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

Linux查看系统启动时间,uptime命令详解 Linux

前言

排查服务器"为什么重启了"、评估系统稳定性时,需要知道系统上次启动时间和连续运行时长。uptime 是最直接的命令,一行同时给出当前时间、运行时长、在线用户数和平均负载。本篇拆解它的输出含义,并补充查看精确开机时间的其他方法。

一、uptime 基本用法

uptime
# 输出示例:
#  07:35:12 up  18:22,  2 users,  load average: 0.12, 0.08, 0.05

二、输出字段逐项解读

  • 07:35:12:系统当前时间;
  • up 18:22:系统已连续运行 18 小时 22 分钟;如果跨天较长会显示 days,例如 up 3 days, 04:10;
  • 2 users:当前登录的会话数(包含 ssh、终端、图形会话,重复登录会重复计数,不等于在线人数);
  • load average: 0.12, 0.08, 0.05:系统平均负载,分别对应最近 1 分钟、5 分钟、15 分钟 的平均活跃进程数(含运行、等待 CPU、等待 IO 的进程)。

三、平均负载怎么判断是否偏高

平均负载要看 CPU 核心数才有意义:

# 查看 CPU 核心数
nproc
# 或
cat /proc/cpuinfo | grep "processor" | wc -l

经验判断:

  • 负载值 < CPU 核数:CPU 处理得过来;
  • 负载 ≈ 核数:接近饱和;
  • 负载 > 核数持续几分钟:进程在排队,需要结合 top、vmstat 排查是 CPU 密集还是 IO 密集;
  • 1 分钟高、5/15 分钟低:短时高峰;三分钟趋势接近且都偏高:持续压力。

四、uptime 常用参数

# 简洁模式,只显示运行时长
uptime -s
# 显示上次开机时间(精确到时分秒)
# 输出示例:2026-10-21 13:12:49

uptime -p
# 漂亮格式:up 18 hours, 22 minutes

五、其他查看开机时间的方法

# 1. who -b 查看上次启动时间
who -b

# 2. last reboot 列出历次重启记录(查谁重启、何时重启)
last reboot | head

# 3. 读取 /proc/uptime(第一个值为秒数,第二个为空闲秒数)
cat /proc/uptime

# 4. systemd 系统用 systemd-analyze 看启动耗时
systemd-analyze

六、常见坑

  1. up 后面格式看错:18:22 是小时:分钟,不是当天时间;跨天会出现 days;
  2. users 当成真实人数:它统计会话数,一条 ssh 断线未退出也会占一个会话;用 w 或 who 看具体登录人;
  3. 负载和 CPU 占用混淆:高负载可能是磁盘 IO 等待导致,CPU 使用率反而不高,要结合 top 中 %wa 判断;
  4. 不结合核数看负载:4 核机器负载 2.0 很轻松,1 核机器负载 2.0 已经排队;
  5. uptime -s 拿到的是开机时间,不是进程启动时间:查某个服务何时启动用 ps -o lstart -p PID。

七、排查组合命令

# 一次看:运行时长、负载、CPU 核数、当前登录人
uptime
nproc
w

服务异常时先看 uptime:若运行时长很短,说明机器刚重启,先确认是计划重启、断电还是崩溃重启,再结合 last reboot 和 /var/log/messages 定位原因。

总结

uptime 一行给出当前时间、已运行时长、登录会话数和 1/5/15 分钟负载;判断负载要除以 CPU 核数;精确开机时间用 uptime -s、who -b、last reboot;重启类故障先确认运行时长和重启记录,再往下查系统日志。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:35 

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

前言

排查磁盘满时最容易混淆 du 和 df:一个统计文件实际占用,一个统计分区已用空间,二者数字常常对不上。搞清楚各自口径、配合使用,才能准确找到占空间的目录和被已删除但仍被进程占用的空间。本篇讲清两者区别、常用参数和排查组合拳。

一、df:看分区(文件系统)整体用量

df 读取文件系统超级块,统计每个分区总容量、已用、可用、挂载点,回答的是"这块盘还剩多少"。

# 人类可读格式(K/M/G),显示文件系统类型
df -hT
# 只看某个挂载点
df -h /var
# 列出 inode 使用情况(空间没满但报 No space 时排查)
df -i

参数:-h 人类可读,-T 显示类型,-i 查看 inode,-x tmpfs 排除内存临时文件系统。

二、du:统计目录/文件实际占用

du 遍历目录树累加每个文件大小,回答的是"哪个目录最占地方"。

# 查看当前目录大小,人类可读
du -sh .
# 查看 /var 下一级子目录大小并排序(从大到小)
du -h --max-depth=1 /var | sort -rh | head -20
# 查看单个文件大小
du -h /var/log/messages
# 统计当前目录下各子目录,只显示总计
du -sh /var/*

参数:-s 只显示汇总,-h 人类可读,--max-depth=N 限定统计层级,-x 不统计其他挂载点。

三、两者核心区别

对比项 df du
统计对象 文件系统分区整体 目录/文件实际大小
数据来源 超级块分配/使用记录 遍历文件累加
回答问题 盘还剩多少 哪个目录占空间
典型用途 判断是否磁盘满、inode 耗尽 定位大目录、大文件

四、为什么 du 和 df 数字对不上

常见三种原因:

  1. 已删除文件仍被进程占用:文件删掉了但进程没释放句柄,du 不再统计,df 仍计入已用。用 lsof | grep deleted 找到占用进程,重启或截断对应文件即可释放。
  2. 硬链接重复统计口径:du 按目录累加,硬链接在不同目录可能被重复计数;df 看块设备分配更准。
  3. 隐藏在挂载点下的旧文件:目录里先写了数据,后在该路径挂载新盘,旧文件被遮盖,du 看不到,df 上一层分区仍占用。

五、磁盘满排查标准流程

# 1. 先用 df 确认哪个分区满了、inode 是否耗尽
df -h
df -i
# 2. 进入对应分区,逐层 du 找大目录
du -h --max-depth=1 /var | sort -rh | head
# 3. 找大于 500M 的文件
find /var -type f -size +500M -exec ls -lh {} \;
# 4. 检查被删除但仍占用空间的文件
lsof | grep deleted

定位到日志、缓存、旧备份等大文件后,优先归档或压缩,不要直接 rm 正在被写入的日志,应截断:

# 清空正在写入的日志而不释放句柄冲突
> /var/log/nginx/access.log

六、常见坑

  1. 只 du 不 df:看完目录不大,却忽略分区已 100%;
  2. du -sh / 统计到其他挂载点:加 -x 限定当前文件系统;
  3. 误删正在写入的大日志:空间不释放,应先重启对应服务或用 > 截断;
  4. 只看磁盘空间忽略 inode:小文件过多时空间有剩但创建文件失败,用 df -i 排查;
  5. 权限不足漏统计:普通用户 du 部分目录读不到,排查时用 root。

总结

df -h 看分区用量和剩余,du -sh --max-depth=1 目录 逐层定位大目录;两者数字不一致时优先怀疑"已删除但被进程占用"的文件,用 lsof | grep deleted 核对。排查顺序:先 df 定位分区,再 du 找目录,最后 find 找具体大文件。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:33 

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

前言

部署网站时常遇到 Nginx 报 403、PHP 无法写入上传目录,根子多半是文件/目录权限不对。理解 Linux 三组身份(属主、属组、其他)和 rwx 三位数字,再用 chmod/chown 调整,问题基本都能解决。本篇讲清 755、644 等常用权限数字的含义和修改方法。

一、先看权限:ls -l

ls -l index.php
# 输出示例:-rw-r--r-- 1 www www 1234 Oct 22 07:20 index.php

第一位 - 是文件类型(d 目录、l 软链接);后面9位分三组:

分组 含义 对应数字位
前三位 文件属主 user 第1位
中间三位 文件属组 group 第2位
后三位 其他用户 other 第3位

二、rwx 与数字对应关系

  • r 读 = 4
  • w 写 = 2
  • x 执行 = 1
  • - 无权限 = 0

把每组数字相加得到该组权限:

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

三、常用权限数字含义

  • 644 文件:属主读写,属组和其他只读。普通网页文件、配置文件标准权限。
  • 755 目录 / 可执行脚本:属主读写执行,属组和其他读+执行。目录必须有 x 才能进入,脚本必须有 x 才能执行。
  • 777 所有人全权:方便但不安全,仅临时调试用,网站目录绝不要长期开放 777。
  • 600 私密文件:只有属主能读写,适合存放密钥、配置里的密码文件。

目录规范建议:目录 755,普通文件 644,可执行脚本 755。

四、chmod 修改权限

# 给单个文件设644
chmod 644 index.php
# 给目录设755
chmod 755 /var/www/html
# 递归修改目录及其下所有文件权限(注意目录和文件权限要分开处理)
chmod -R 755 /var/www/html

符号写法(叠加/去除):

# 给属主加执行权限
chmod u+x script.sh
# 给组和其他去除写权限
chmod go-w index.php
# 属组可写
chmod g+w /data

五、chown 属主属组

权限对了但属主不对,PHP 进程仍可能写不进去:

# 修改属主为 www
chown www index.php
# 同时改属主和属组
chown www:www /var/www/html
# 递归修改
chown -R www:www /var/www/html

六、常见坑

  1. 目录没加 x 权限:目录权限 644 会导致无法 cd 进入和列目录,网页报 403;
  2. 把文件也设成 755/777:普通文件不需要执行位,777 会放大安全风险;
  3. 递归时文件目录一刀切:用 find 分开处理目录和文件,见下方命令;
  4. 只改权限不改属主:Nginx/PHP-FPM 以 www 用户运行,文件属主是 root 时仍读不到;
  5. SELinux 拦截:CentOS 上权限看似正确仍 403/500,要检查 SELinux 上下文。

目录与文件分开递归:

# 目录全部755
find /var/www/html -type d -exec chmod 755 {} \;
# 文件全部644
find /var/www/html -type f -exec chmod 644 {} \;

总结

r=4 w=2 x=1,文件常用 644、目录常用 755;chmod 改权限、chown 改属主属组;递归时目录和文件权限分开设置,网站目录不要长期用 777。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:22 

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

前言

服务器上为不同人员或程序分配账号,是Linux基础运维的常见操作。创建账号要顺便建好家目录、设好初始密码;删除账号要决定是否清掉家目录和邮件;改密码分root改别人密码和用户改自己密码两种场景。本篇把常用命令一次讲全。

一、创建用户

# 新建用户,同时创建家目录 /home/www
useradd -m www
# 指定UID、家目录、登录Shell、所属组
useradd -u 1001 -d /home/www -s /bin/bash -G wheel www
# 设置初始密码(交互式两次输入)
passwd www

参数说明:

  • -m:自动创建 /home/用户名 家目录;
  • -s:指定登录Shell,不想登录给 /sbin/nologin;
  • -G:附加到指定组;
  • -M:不创建家目录(服务账号常用)。

一键创建并设密码(脚本场景,免交互):

useradd -m deploy
echo 'Deploy@123456' | passwd --stdin deploy

二、查看用户信息

# 查看用户UID、GID、所属组
id www
# 查看 /etc/passwd 里该用户记录
grep www /etc/passwd
# 查看组信息
groups www

三、修改密码

# root修改任意用户密码(交互式)
passwd www
# 用户自己改自己的密码
passwd
# 强制该用户下次登录改密码
passwd -e www
# 锁定账号(禁止登录)
usermod -L www
# 解锁
usermod -U www

四、修改用户属性

# 改用户名
usermod -l newname oldname
# 改登录Shell
usermod -s /sbin/nologin www
# 加入sudo组(CentOS为wheel)
usermod -aG wheel www

五、删除用户

# 只删账号,保留家目录和邮件
userdel www
# 连家目录、邮件一起删除(推荐,避免残留占空间)
userdel -r www
# 若提示用户进程仍在运行,先终止相关进程
pkill -u www

删除前确认该用户名下没有正在跑的重要服务,否则会误停业务。

六、常见坑

  1. 服务账号没设 /sbin/nologin:容易被登录爆破,数据库、nginx这类程序账号应禁止Shell登录;
  2. userdel 没加 -r:家目录残留,多次建删会堆很多无用目录;
  3. 改了用户名没改家目录属主:chown -R www:www /home/www 补一下;
  4. 密码太简单被拒绝:passwd 报错 BAD PASSWORD,可强制用 echo ... | passwd --stdin 绕过复杂度检查(生产环境仍应设强密码);
  5. 服务账号误删:先 id 和 ps -u www 确认归属再删。

总结

useradd -m 用户名 建号、passwd 用户名 设密码;root用 passwd 用户名 改任意账号密码,用户用 passwd 改自己的;userdel -r 用户名 连家目录一起删,删前先确认该账号名下没有运行中的服务。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-22 07:21 

Linux查看主机名 Linux

Linux查看主机名

引言

多台服务器排障、日志定位、主机识别时先确认主机名。hostname命令最直接,hostnamectl看完整静态/瞬态/灵活名,cat /etc/hostname看持久化配置,三者来源不同,排障时别混。

查看当前主机名

hostname

一行输出当前系统主机名,登录终端提示符里显示的就是它。

hostnamectl 详细信息

hostnamectl

显示静态主机名、瞬态主机名、灵活主机名,还有操作系统、内核、架构等信息,CentOS7以上通用。

查看持久化配置

cat /etc/hostname

这里保存的是重启后生效的主机名,临时hostname改了不落盘,重启会回到这里的值。

查看IP对应名称

hostname -I

输出本机所有非回环IP,配合主机名做主机识别。

临时修改(重启失效)

hostname web-server-01

当前会话立即生效,重启后被/etc/hostname覆盖。

永久修改

hostnamectl set-hostname web-server-01

写入/etc/hostname,重启后保留;改完重连SSH或执行bash使提示符刷新。

注意事项

  • 主机名建议用小写字母、数字、中划线,别用中文和下划线;
  • 主机名含点号会被当成FQDN,短名和全名分开看;
  • 改完主机名记得同步/etc/hosts里127.0.0.1映射,避免部分解析异常;
  • 容器内hostname通常跟随容器名,重启重建会变;
  • 集群里主机名要规范统一,便于日志检索和监控告警;
  • 临时hostname与静态名不一致时,以配置文件为准。

总结

hostname查看当前主机名,hostnamectl看完整主机名分类和系统信息,cat /etc/hostname看持久化配置,hostname -I看本机IP。临时用hostname改名立即生效但重启失效,永久用hostnamectl set-hostname写入配置。主机名规范用小写加中划线,修改后同步/etc/hosts映射,集群命名统一便于日志检索与监控告警。


emer 发布于  2026-10-22 07:11 

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

前言

服务器内存吃紧、Swap被刷爆,往往是某个程序内存泄漏或卡死进程占着不放。要先找到"谁在吃内存",确认后再决定是优雅重启还是直接kill。本篇给出从查进程到杀进程的完整命令。

一、按内存占用排序找进程

ps 一次性列出并排序,输出RES(实际物理内存,单位KB):

# 按内存占用从高到低,取前10
ps aux --sort=-%mem | head -10
# 按CPU占用排序
ps aux --sort=-%cpu | head -10

列说明:USER 进程用户、%MEM 内存占比、RSS 实际物理内存、COMMAND 启动命令。

更直观的内存排行:

# 显示内存占用最高的进程,VSZ/RSS单位KB
ps -eo pid,ppid,user,%mem,%cpu,rss,comm --sort=-rss | head

二、用top/htop交互查看

top
# 进入后按 M 按内存排序,按 P 按CPU排序,k 输入PID杀进程,q退出

装个 htop 更清楚:

yum install -y htop
htop

三、按名字批量找进程PID

# 查php-fpm相关进程
pgrep -af php-fpm
# 或
ps -ef | grep php-fpm | grep -v grep

pgrep 只输出PID,-a 带命令行。

四、kill进程(先温柔再强杀)

# 正常结束(SIGTERM=15),给进程清理机会
kill PID
# 按名字结束所有同名进程
killall php-fpm
pkill -f "php think"
# 杀不掉再强制杀(SIGKILL=9),数据可能损坏,最后手段
kill -9 PID

信号优先级:

  • kill -15(默认):请求退出,进程可捕获;
  • kill -9:直接杀死,无法拦截。

服务类进程优先用它自己的重启命令而不是裸kill:

systemctl restart php-fpm

五、常见坑

  1. 只看%MEM不看RSS:共享内存会被重复算,判断真实占用看RSS;
  2. 上来就kill -9:数据库、日志服务强杀可能坏数据,先15再9;
  3. 杀错进程:杀之前用 ps -p PID -o cmd 确认这个PID到底是谁;
  4. 僵尸进程杀不掉:状态Z的僵尸要杀它的父进程,僵尸本身已经不占CPU只占PID表;
  5. kill完又自动起来:被systemd/守护进程托管,要用 systemctl stop 或它的管理命令,否则白杀。

总结

ps aux --sort=-%mem | head 或 top 按M排序找内存大户,确认PID后先用 kill(15)优雅结束,不行再 kill -9。服务类进程优先 systemctl restart,避免强杀造成数据损坏。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-21 07:24 

Linux日志过大占满磁盘,logrotate日志切割配置 Linux

前言

网站跑久了,Nginx、MySQL、PHP-FPM的日志几个G地涨,df -h一看磁盘被日志占满,服务直接报错。手动删不是长久之计,logrotate 是Linux自带的日志切割工具,按天/按大小自动切分并保留指定份数,配一次永久省心。

一、logrotate工作原理

logrotate本身靠系统定时任务(/etc/cron.daily/logrotate)每天跑一次,读取配置:

  • 全局配置:/etc/logrotate.conf
  • 自定义配置目录:/etc/logrotate.d/
    我们一般在 /etc/logrotate.d/ 下为某个服务单独写配置。

二、以Nginx日志为例配置

新建 /etc/logrotate.d/nginx:

/var/log/nginx/*.log {
    daily                 # 按天切割
    missingok             # 日志不存在不报错
    rotate 14             # 保留14份历史
    compress              # 切割后gzip压缩
    delaycompress         # 延迟一次再压缩,避免影响正在写的文件
    notifempty            # 空日志不切割
    create 0644 nginx nginx  # 新建日志文件属主权限
    sharedscripts         # 多个日志只执行一次postrotate
    postrotate
        if [ -f /run/nginx.pid ]; then
            kill -USR1 `cat /run/nginx.pid`
        fi
    endscript
}

关键点:切割后要给Nginx发USR1信号,让它重新打开日志文件,否则还会往旧文件写。

三、按大小切割(不限时间)

如果日志涨得快,按大小更合理:

/var/log/nginx/error.log {
    size 100M            # 超过100M切
    rotate 10
    compress
    missingok
    notifempty
    create 0644 nginx nginx
    postrotate
        kill -USR1 `cat /run/nginx.pid`
    endscript
}

四、测试与立即执行

不等到定时,手动试运行(调试用 -d 打印过程不真正执行):

# 调试,看会做什么
logrotate -d /etc/logrotate.d/nginx
# 强制立即切割一次
logrotate -f /etc/logrotate.d/nginx

切割后原日志变成 xxx.log-20261021,隔天再压成 .gz。

五、常见坑

  1. 切割后服务还往旧文件写:缺postrotate里的 kill -USR1,或pid路径写错,导致旧文件越来越大;
  2. 直接rm删正在写的日志:空间没释放,要 > 文件 清空或重启服务;
  3. compress和delaycompress一起用仍报错:第一次切出的文件先不压,第二次才压,别误以为没生效;
  4. 日志目录属主不对:create指定的用户组要真实存在,否则新建文件失败;
  5. cron没跑:确认 crond 服务开机自启,否则logrotate永远不触发。

总结

在 /etc/logrotate.d/ 为每个大日志写一份切割规则,配好daily/size、rotate份数和postrotate信号重开日志,logrotate -f 验证一次,磁盘就不会再被单个日志吃满。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-21 07:22 

Linux查看系统时间 Linux

Linux查看系统时间

引言

日志时间对不上、证书过期误判、定时任务不对点,常常是系统时间不准导致的。运维第一件事就是date看时间、timedatectl看时区,服务器必须用NTP同步,否则业务时间戳全乱。

查看当前时间:date

date

输出年月日、时分秒和时区,最常用。

自定义格式输出

date +"%Y-%m-%d %H:%M:%S"
# 2026-10-21 07:03:00

脚本里取指定格式时间做日志前缀。

查看时间戳

date +%s

输出当前Unix时间戳,排查时间差时用。

查看时区与NTP状态

timedatectl

显示本地时间、UTC、时区、NTP同步是否开启,比date信息全。

硬件时间 vs 系统时间

hwclock --show

读主板RTC硬件时钟,系统时间和硬件时间不一致会导致重启后时间跳变。

手动同步一次

timedatectl set-ntp true
# 或
ntpdate ntp.aliyun.com

开启NTP自动同步,国内用阿里云或ntp.aliyun.com源。

注意事项

  • 云服务器一般已开NTP,别手动硬改时间;
  • 时间跳变会影响日志排序和证书有效期判断;
  • 容器内时间默认跟宿主机,宿主机准了容器就准;
  • 时区不对用timedatectl set-timezone Asia/Shanghai;
  • 不要随便set-time往前拨,数据库主从时间差会出问题;
  • 定时任务执行异常先查系统时间和时区。

总结

date看当前时间、date+%s取时间戳、timedatectl看时区和NTP状态、hwclock看硬件时钟。服务器开启NTP自动同步,时区设Asia/Shanghai,时间不对先查NTP和时区,别手动硬改,时间跳变会影响日志、证书和数据库主从,定时任务异常优先核对系统时间。


emer 发布于  2026-10-21 07:03 

Linux查看CPU内存负载,top命令详解 Linux

前言

服务器变慢、网站卡顿,第一反应是看 CPU 和内存谁吃满了。top 是 Linux 自带的实时监控命令,能动态看到系统负载和每个进程的占用。本篇讲清楚 top 界面每一行含义、常用按键,以及怎么判断到底是 CPU 满还是内存满。

一、启动top

top

进入动态刷新界面,默认每3秒刷新一次,按 q 退出。

二、顶部系统信息各行含义

  • 第一行:load average 三个数分别是1分钟、5分钟、15分钟平均负载,数值超过CPU核数说明忙不过来;
  • 第二行 Tasks:进程总数、运行中、睡眠、停止、僵尸进程数;
  • 第三行 CPU:%us 用户进程占用、%sy 系统内核占用、%id 空闲,id接近0说明CPU紧张;
  • 第四行 Mem:物理内存总量、已用、空闲、缓存;
  • 第五行 Swap:交换分区使用,频繁交换说明内存不足。

看核数判断负载:

nproc
# 假设2核,load average长期超过2就要警惕

三、进程列表关键列

  • PID 进程号;
  • %CPU CPU占用百分比;
  • %MEM 内存占用百分比;
  • RES 进程实际占用物理内存(KB);
  • COMMAND 启动命令。

四、常用交互按键

按键 作用
P 按CPU占用降序
M 按内存占用降序
1 展开每个核心单独显示
k 输入PID杀掉进程
q 退出
# 静态一次性输出top结果(适合脚本/采集)
top -bn1 | head -20
# 只看某个进程
top -p PID

五、判断思路

  1. CPU高:按P排序,找%CPU高的进程,常见是死循环PHP、爬虫、计算任务;
  2. 内存高:按M排序看%MEM和RES,常见内存泄漏、缓存过大;
  3. 负载高但CPU不高:可能是大量I/O等待或僵尸进程,配合 iostat、vmstat 看;
  4. Swap被大量使用:物理内存不够,系统把内存换到磁盘,会明显变慢。

常见坑

  1. 把load average绝对值当指标:要结合核数,1核负载3和8核负载3完全不同;
  2. 只看%CPU不看持续时间:瞬时冲高正常,持续90%以上才是问题;
  3. RES和SHR混淆:RES是独占物理内存,判断内存占用看RES;
  4. 僵尸进程多:Z 状态,父进程没回收,需要找父进程处理。

总结

top 里按P看CPU、按M看内存,先看顶部load和核数是否匹配,再定位具体进程。CPU满找%CPU高的,内存满找%MEM高的,再决定优化或kill。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-20 07:28 

Linux磁盘占用100%怎么排查,大文件查找清理方法 Linux

前言

服务器磁盘爆满到100%,会导致网站写不了日志、数据库报错、服务异常退出。很多人只看到根目录满,却找不到到底是谁占的。本篇按"先看分区→再找大目录→再找大文件→安全清理"的顺序给出可直接执行的命令。

一、先看哪个分区满了

df -h

看 Use% 列,找到达到100%的挂载点(常见是 / 根分区或 /data)。注意区分分区,别在没满的分区里瞎找。

二、逐级定位占用最大的目录

# 从根目录开始,显示一级目录大小,排序,排除挂载点干扰
du -h --max-depth=1 / 2>/dev/null | sort -rh | head

进入最大的那个目录重复执行,比如:

du -h --max-depth=1 /var 2>/dev/null | sort -rh | head

一层层往下钻,直到定位到具体目录。

三、查找超过指定大小的大文件

# 找出/var下大于500MB的文件
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null | awk '{print $5, $9}'
# 全盘找大于1G的文件
find / -type f -size +1G 2>/dev/null | xargs ls -lh

常见大头:日志文件、MySQL binlog、Docker镜像/容器、上传目录、core dump、旧备份。

四、安全清理方式

  1. 日志文件:确认无用后清空(不要直接删正在写的文件,空间不释放):
    # 清空而不是删除,释放空间且进程句柄仍在
    > /var/log/nginx/access.log
  2. 已删除但仍被进程占用的文件(df满但du对不上):
    lsof | grep deleted
    # 找到对应PID后重启该服务释放句柄
  3. Docker清理:
    docker system df          # 先看占用
    docker system prune -a    # 清理无用镜像、停止容器、悬空卷
  4. 旧备份/binlog:确认可删后 rm -f,MySQL binlog 用 PURGE BINARY LOGS 正规清理。

五、常见坑

  1. 直接rm正在写入的大日志:空间不立刻释放,要 > 文件 清空或重启进程;
  2. df满du小:典型是已删除文件被进程占用,用 lsof | grep deleted 找;
  3. 只删根目录表面:--max-depth=1 逐级下钻才找得到真凶;
  4. 误删数据库文件/系统日志:清理前先 ls -lh 确认,重要数据先备份;
  5. Docker不清理:镜像层和停止容器很容易吃掉几十G,docker system prune 定期跑。

总结

df -h 找满的分区,du --max-depth=1 逐级定位,find -size 找大文件,日志用清空、Docker用prune、被占用文件重启释放。按这条链路,100%磁盘很快能查清楚。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-20 07:26 

Linux crontab定时任务不执行常见原因与排查 Linux

前言

crontab 写好了却到点不执行,是服务器运维最常见的坑之一。手动跑脚本正常,定时任务却没反应,问题往往不在脚本本身,而在服务状态、环境变量、时间格式和权限。本篇按从易到难的顺序列出排查点。

一、先确认crond服务在运行

systemctl status crond
# 没启动就启动并设开机自启
systemctl start crond
systemctl enable crond

服务没跑,所有定时任务都不会触发,这是第一个要查的。

二、检查定时任务格式是否正确

标准格式:分 时 日 月 周 命令

# 查看当前用户的定时任务
crontab -l
# 例如:每10分钟执行一次脚本
*/10 * * * * /usr/bin/php /www/backup.php

常见格式错误:分钟位置写成了小时、用了 * 却想表示"第1个"、命令路径用了相对路径。

三、查看cron日志,判断有没有触发

# CentOS7 日志位置
tail -f /var/log/cron

到点看日志里有没有出现这条任务:

  • 日志里根本没有:格式没被识别、服务没跑、或时间写错;
  • 日志有执行记录但没效果:是脚本/环境问题,往下查。

四、脚本环境变量问题(高频)

cron 的环境比手动登录干净得多,很多命令找不到、相对路径失败。解决:

  1. 用绝对路径:脚本里和任务里都写全,比如 /usr/bin/php、/www/backup.php;
  2. 开头加载环境:
    */10 * * * * source /etc/profile; /usr/bin/php /www/backup.php
  3. 先手动用cron环境复现:env -i /bin/bash script.sh 模拟干净环境跑一遍。

五、权限与重定向

  • 脚本要有执行权限:chmod +x /www/backup.sh;
  • 脚本没加 shebang(#!/bin/bash)会找不到解释器;
  • 把错误输出留下来方便定位:
    */10 * * * * /usr/bin/php /www/backup.php >> /www/log/cron.log 2>&1

    加了 2>&1,报错就写进日志,不再"静默失败"。

六、其他易漏点

  1. 时区不一致:timedatectl 看系统时区,容器里时间错会导致任务错位;
  2. 日和周同时指定是"或"关系,容易误触发,注意语义;
  3. root和普通用户任务混淆:sudo crontab -l 看root的,普通用户看自己的;
  4. 磁盘满了:日志写不进去,任务看似没执行。

总结

排查顺序:crond服务是否运行 → 任务格式对不对 → /var/log/cron 有没有触发 → 绝对路径和环境变量 → 执行权限与错误重定向 → 时区。手动正常、定时不跑,九成是环境变量和绝对路径问题。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-20 07:26 

Linux查看服务器开放端口,netstat和ss命令教程 Linux

前言

排查网站打不开、端口是否被占用、服务有没有监听,都要先看服务器开放了哪些端口。Linux 上最常用的两个工具是 netstat 和 ss,ss 是新系统推荐的替代,速度更快。本篇讲清楚两个命令的常用组合和怎么判断监听状态。

一、ss命令(推荐,CentOS7自带)

# 查看所有正在监听的TCP端口
ss -tlnp
# 查看所有正在监听的UDP端口
ss -ulnp
# 统计各类连接数量
ss -s

参数含义:-t TCP、-u UDP、-l 只看监听、-n 数字形式显示端口号(不解析域名/服务名)、-p 显示占用进程。

二、netstat命令(老系统常用,需net-tools)

CentOS7 最小化可能没装,先装:

yum install -y net-tools

常用:

# 查看所有监听的TCP端口和进程
netstat -tlnp
# 查看UDP监听
netstat -ulnp
# 查看80端口被谁占用
netstat -tlnp | grep ':80'
# 查看所有已建立连接
netstat -anp | grep ESTABLISHED

三、判断端口是否在监听

以80端口为例:

ss -tlnp | grep ':80'
# 或
netstat -tlnp | grep ':80'
  • LISTEN 表示正在监听,服务正常;
  • 没有任何输出说明该端口没被程序监听;
  • 最后一列能看到进程名和PID,比如 nginx: worker。

四、常用排查组合

# 查某个具体端口(443)
ss -tlnp | grep 443
# 查某进程监听了哪些端口
ss -tlnp | grep nginx
# 实时看连接数最多的IP
ss -tn state established | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

五、常见坑

  1. 看不到进程名要加 -p,且需要root:普通用户只能看到端口,看不到占用程序,用 sudo 或 root 执行;
  2. 只看监听不够:服务在本机监听但防火墙/安全组没放行,外网依然连不上,还要配合 firewalld 和云安全组检查;
  3. netstat 找不到命令:是没装 net-tools,yum install -y net-tools;
  4. -n 别漏:不加会把80显示成http,grep端口号时容易匹配不到。

总结

记住 ss -tlnp 看 TCP 监听、ss -ulnp 看 UDP、| grep 端口号 精准定位,老机器用 netstat 同参数即可。先确认本机监听,再查防火墙和安全组,排查链路才完整。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-20 07:24 

Linux查看登录用户 Linux

Linux查看登录用户

引言

服务器被多人SSH登录或排查异常连接时,需要看清当前是谁在线、从哪里连进来、在做什么。who、w、id、last几个命令配合,能区分当前身份、在线会话和历史登录记录。

我是谁:whoami

whoami

直接输出当前执行命令的用户名,脚本里判断身份最常用。

查看自己的UID和组

id

输出uid、gid和所属附加组,比whoami信息更全,判断权限时用。

谁在线:who

who

列出所有已登录用户、终端tty、登录时间和来源IP。

在线会话详情:w

w

比who多一列当前正在执行的命令和空闲时长,能看到每个会话在干什么。

历史登录记录:last

last -10

读取/var/log/wtmp,列出最近登录的用户、终端、来源IP和时长,排查入侵看历史。

查特定用户

w root
last root

指定用户名过滤,聚焦某账号的在线和历史。

注意事项

  • whoami只看当前身份,who/w看所有在线会话;
  • w的JCPU是终端累计时间,PCPU是当前进程时间;
  • last依赖wtmp日志,日志轮转后只保留近期;
  • 异常来源IP、陌生账号要结合last和/var/log/secure排查;
  • 系统服务进程不占登录会话,who看不到;
  • 切换用户su后whoami变新用户,但w仍显示原始登录终端。

总结

whoami看当前用户名,id看UID和组,who列在线用户与来源IP,w多显示正在执行的命令,last查历史登录记录。排查时先w看当前在线会话,再last回溯历史,陌生IP和账号结合secure日志,su切换后身份以whoami为准但终端归属原始登录人。


emer 发布于  2026-10-20 07:21 
'); })();