在指定时间自动执行(cron)
这里介绍如何像“每天凌晨 4 点备份”“每 10 分钟检查状态”“服务器启动时运行机器人”这样,在指定的时间自动执行命令。以 Ubuntu、Debian 为准。
先将服务器时间设为韩国时间
cron 按照服务器的时区运行。如果服务器设置为 UTC(比韩国慢 9 小时),“凌晨 4 点”就会变成韩国时间下午 1 点。
timedatectl # 查看 Time zone 行
sudo timedatectl set-timezone Asia/Seoul # 改为韩国时间
sudo systemctl restart cron # 重启 cron,使其使用更改后的时区
打开 crontab
crontab -e
首次运行时会提示选择编辑器,选择 nano(通常是 1 号)会比较简单。在最下方逐行添加要定时执行的内容,然后按 Ctrl + O、Enter、Ctrl + X 保存并退出。
时间的写法
分 时 日 月 星期 要执行的命令
| 写法 | 含义 |
|---|---|
0 4 * * * | 每天凌晨 4 点 |
*/10 * * * * | 每 10 分钟 |
0 */6 * * * | 每 6 小时(0 点、6 点、12 点、18 点) |
30 9 * * 1 | 每周一上午 9 点 30 分 |
0 0 1 * * | 每月 1 日零点 |
@reboot | 服务器启动时执行一次 |
如果搞不清楚,可以在 crontab.guru 网站上输入试试,它会用文字说明何时执行。
示例
# 每天凌晨 5 点重启用 pm2 运行的机器人
0 5 * * * /usr/bin/pm2 restart my-bot >> /home/username/cron.log 2>&1
# 服务器启动时运行自己的脚本
@reboot /home/username/start.sh >> /home/username/cron.log 2>&1
关于定时备份,请参阅备份服务器数据中的“每天自动备份”。
必须遵守的事项
- 命令和文件要写完整路径。cron 的环境与平时的终端不同,只写
pm2、node的话,很多时候会找不到。完整路径可以用which pm2、which node查看。 - 将结果记录到日志文件。在行尾加上
>> /home/username/cron.log 2>&1,失败时就可以看到原因。 - 给脚本赋予执行权限。
chmod +x start.sh - 命令中的
%要写成\%。在 cron 中,%会被解释为换行。(例如:$(date +\%F)) - 需要管理员权限的任务(如重启服务器等)要在
sudo crontab -e中注册。
确认是否注册成功
crontab -l # 查看已注册的列表
journalctl -u cron --since today # 今天的 cron 执行记录
如果是 Windows 服务器
在 Windows 中,“任务计划程序”起到同样的作用。请参阅在 Windows 服务器上自动运行程序。