每月1号凌晨2:30执行脚本需配置为“30 2 1 ”,其中1表示每月1号而非第一个周一;需确保脚本可执行、使用绝对路径、显式声明解释器,并可添加PATH和日志重定向。

在 Linux 中,用 crontab 设置每月初执行脚本,关键是正确配置时间字段,尤其要理解 1 表示“每月 1 号”,而非“每月第一个星期一”。
每月 1 号凌晨自动运行脚本
这是最常见也最直接的“每月初”场景。编辑当前用户的 crontab:
crontab -e
添加一行(例如每天凌晨 2:30 执行):
30 2 1 * * /path/to/your/script.sh
说明:
- 30:第 30 分钟
- 2:凌晨 2 点
- 1:每月 1 号
- *(第三、四、五个星号):任意月份、任意星期几、任意年份
注意:该任务只在每月 1 号触发,与星期几无关。
确保脚本可执行且环境变量正确
cron 默认使用最小化 shell 环境(通常是 /bin/sh),不加载用户 profile,容易因路径或命令找不到而失败。建议:
- 给脚本添加执行权限:
chmod +x /path/to/script.sh - 脚本开头显式声明解释器,如
#!/bin/bash - 在脚本中使用绝对路径调用命令(如
/usr/bin/python3而非python3) - 必要时在 crontab 中定义 PATH,例如:
PATH=/usr/local/bin:/usr/bin:/bin<br> 30 2 1 * * /path/to/script.sh
验证是否生效 & 排查常见问题
设置后不是立即生效,需等待下次匹配时间(即下一个 1 号)。快速验证方法:
- 临时改成几分钟后执行(如
* * * * *测试能否跑通) - 检查系统 cron 服务是否运行:
systemctl status cron(Ubuntu/Debian)或systemctl status crond(CentOS/RHEL) - 查看 cron 日志(通常在
/var/log/syslog或/var/log/cron),搜索CRON关键词 - 确认脚本输出有记录,可在 crontab 行末加日志重定向:
30 2 1 * * /path/to/script.sh >> /var/log/montly-job.log 2>&1
补充:如果真需要“每月第一个工作日”怎么办?
cron 本身不支持“每月第一个周一/周二…”这种逻辑,但可通过 shell 判断绕过。例如,在脚本中加判断:
#!/bin/bash
# 只在每月第一个工作日(周一至周五)运行
day_of_month=$(date +%-d)
day_of_week=$(date +%-u) # 1=Mon, 7=Sun
if [[ $day_of_month -le 7 ]] && [[ $day_of_week -le 5 ]]; then
# 执行你的主逻辑
echo "Running on first weekday of month"
fi
然后 crontab 设为每天执行:0 9 * * * /path/to/wrapper.sh,由脚本内部决定是否真正执行。


















