详细步骤
第零步:准备工作(创建脚本目录)
我们先把要用的脚本放在一个专门的目录里,方便管理。
# 在 web 用户家目录下创建一个名为 scripts 的目录
mkdir -p /home/web/scripts
# 进入这个目录
cd /home/web/scripts
第一步:编写日志切割脚本
这是核心步骤。我们将创建一个 shell 脚本,来完成之前 logrotate
所做的所有事情。
创建脚本文件
# 使用 vim 或 nano 创建脚本文件 vim rotate_nginx_logs.sh
粘贴以下脚本内容
请将下面所有的代码完整地复制并粘贴到
rotate_nginx_logs.sh
文件中。#!/bin/bash # ================================================================= # Nginx Log Rotation Script for non-root users # Author: Your Name # ================================================================= # --- 配置区 --- # 你的 Nginx 日志文件所在目录 LOGS_PATH="/home/web/nginx/logs" # 你的 Nginx PID 文件路径 PID_FILE="$LOGS_PATH/nginx.pid" # 保留多少天的日志(例如,保留14天的压缩日志) RETAIN_DAYS=14 # --- 配置区结束 --- # --- 执行区 --- # 检查日志目录是否存在 if [ ! -d "$LOGS_PATH" ]; then echo "错误: 日志目录 $LOGS_PATH 不存在。" exit 1 fi # 检查 PID 文件是否存在 if [ ! -f "$PID_FILE" ]; then echo "错误: Nginx PID 文件 $PID_FILE 未找到。" exit 1 fi # 1. 移动(重命名)当前的日志文件 # 使用昨天的日期来命名备份文件,更符合常规 YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) mv "$LOGS_PATH/access.log" "$LOGS_PATH/access.log-${YESTERDAY}" mv "$LOGS_PATH/error.log" "$LOGS_PATH/error.log-${YESTERDAY}" # 2. 通知 Nginx 重新生成新的日志文件 # 这是最关键的一步,与之前手动操作完全一样 kill -USR1 $(cat "$PID_FILE") # 等待一小会儿,确保新日志文件已创建 sleep 5 # 3. 压缩刚刚移动的旧日志文件 gzip "$LOGS_PATH/access.log-${YESTERDAY}" gzip "$LOGS_PATH/error.log-${YESTERDAY}" # 4. 删除超过保留天数的旧日志文件 # find 命令会查找所有超过 RETAIN_DAYS 天的 .gz 文件并删除它们 find "$LOGS_PATH" -name "*.log-*.gz" -mtime +$RETAIN_DAYS -exec rm -f {} \; echo "Nginx 日志切割完成。" # --- 执行区结束 ---
保存并退出
在vim
中,按ESC
,然后输入:wq
并回车。
第二步:给脚本添加执行权限
创建的脚本默认是没有执行权限的,我们需要给它加上。
# 确保你还在 /home/web/scripts 目录下
chmod +x rotate_nginx_logs.sh
现在你可以试着手动运行一下这个脚本,看看它是否能正常工作:
./rotate_nginx_logs.sh
如果一切正常,它会切割当前的日志,并输出 “Nginx 日志切割完成”。
第三步:设置定时任务 (Cron Job)
这是实现“自动化”的关键。我们将使用 crontab
命令来为 web
用户添加一个定时任务。
编辑当前用户的 crontab
crontab -e
第一次运行时,系统可能会让你选择一个默认的文本编辑器(如
nano
或vim
),推荐选择nano
,因为它对新手更友好。添加定时任务规则
在打开的文件的最末尾,添加新的一行,内容如下:
# 每天凌晨 00:01 执行 Nginx 日志切割脚本 01 00 * * * /home/web/scripts/rotate_nginx_logs.sh > /dev/null 2>&1
规则解释
01 00 * * *
: 这是cron
的时间格式,代表“每天的 00 点 01 分”。(分钟 小时 日 月 周)/home/web/scripts/rotate_nginx_logs.sh
: 这是要执行的脚本的绝对路径。> /dev/null 2>&1
: 这部分的意思是,将脚本执行过程中所有正常的输出(>
)和错误输出(2>&1
)都重定向到“黑洞”(/dev/null
)里。这样做可以防止cron
因为脚本有输出而给你发送邮件,保持系统干净。
保存并退出
- 如果你用的是
nano
,按Ctrl + X
,然后会提示你是否保存,按Y
,最后按Enter
确认文件名。 - 如果你用的是
vim
,按ESC
,然后输入:wq
并回车。
保存后,系统会提示
crontab: installing new crontab
,这表示你的定时任务已经成功设置好了!- 如果你用的是
总结
现在,你已经成功地在没有 root
权限的情况下,建立了一套完全属于 web
用户的、功能完备的自动化日志切割系统。
从现在开始:
- 每天凌晨 00:01,
cron
会自动触发你的rotate_nginx_logs.sh
脚本。 - 脚本会重命名前一天的日志,并通知 Nginx 创建新日志文件。
- 脚本会压缩重命名后的日志文件。
- 脚本会自动删除14天前的旧压缩日志。
你再也不需要手动管理这些日志文件了。