859 字
4 分钟
Debian时区设置与Crontab定时任务配置

Debian 时区设置与 Crontab 定时任务配置#

服务器时区不对会导致日志时间混乱,定时任务则可以自动化重复性操作。这两个配置是 Linux 基础中的基础。

修改时区为北京时间#

方法:使用 timedatectl(推荐)#

Terminal window
# 查看当前时区
timedatectl status
# 列出所有可用时区
timedatectl list-timezones | grep Shanghai
# 设置为北京时间(Asia/Shanghai)
sudo timedatectl set-timezone Asia/Shanghai
# 验证
timedatectl status

输出示例:

Local time: Fri 2026-03-14 23:30:00 CST
Universal time: Fri 2026-03-14 15:30:00 UTC
RTC time: Fri 2026-03-14 15:30:00
Time zone: Asia/Shanghai (CST, +0800)
旧版系统

如果是 Debian 8 或更早版本,使用交互式菜单:

Terminal window
sudo dpkg-reconfigure tzdata
# 依次选择 Asia -> Shanghai

Crontab 定时任务#

编辑定时任务#

Terminal window
# 编辑当前用户的 crontab
crontab -e
# 编辑系统级 crontab(需要root)
sudo crontab -e

时间格式#

* * * * * 命令
│ │ │ │ │
│ │ │ │ └── 星期 (0-7, 0和7都是周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日期 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)

常用示例#

Terminal window
# 每天凌晨4点执行备份
0 4 * * * /home/user/backup.sh
# 每5分钟检查一次服务
*/5 * * * * /home/user/check_service.sh
# 每周一早上8点发送报告
0 8 * * 1 /home/user/send_report.sh
# 每月1号凌晨3点清理日志
0 3 1 * * /home/user/clean_logs.sh
# 工作日(周一到周五)每2小时执行
0 */2 * * 1-5 /home/user/workday_task.sh

输出重定向#

将任务的输出记录到日志文件:

Terminal window
# 标准输出和错误输出都记录
0 4 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
# 只记录错误
0 4 * * * /home/user/backup.sh >> /var/log/backup.log 2>> /var/log/backup.error.log

环境变量#

crontab 默认的环境变量很少,建议在脚本开头设置:

Terminal window
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/home/user
# 然后才是任务
0 4 * * * /home/user/backup.sh

查看和管理定时任务#

Terminal window
# 查看当前用户的任务
crontab -l
# 删除所有任务(慎用)
crontab -r
# 查看系统级定时任务
cat /etc/crontab
# 查看定时任务日志(Ubuntu/Debian)
grep CRON /var/log/syslog
# 查看定时任务日志(CentOS/RHEL)
grep CRON /var/log/cron

特殊字符串#

Terminal window
@reboot # 系统启动时执行
@yearly # 每年1月1日 0:00 (等同于 0 0 1 1 *)
@monthly # 每月1日 0:00 (等同于 0 0 1 * *)
@weekly # 每周日 0:00 (等同于 0 0 * * 0)
@daily # 每天 0:00 (等同于 0 0 * * *)
@hourly # 每小时 0分 (等同于 0 * * * *)

使用示例:

Terminal window
# 系统启动时启动服务
@reboot /home/user/start_service.sh
# 每天午夜执行
@daily /home/user/daily_task.sh

完整配置示例#

设置服务器时区为北京时间,并添加每日备份任务:

Terminal window
# 1. 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 2. 编辑 crontab
crontab -e
# 3. 添加以下内容
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 每天凌晨4点执行备份,记录日志
0 4 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
# 每10分钟检查代理服务状态
*/10 * * * * /home/user/check_proxy.sh >> /var/log/proxy_check.log 2>&1

常见问题#

问题1:任务没有执行

  • 检查脚本是否有执行权限:chmod +x script.sh
  • 检查日志:grep CRON /var/log/syslog
  • 检查路径是否使用绝对路径

问题2:时区设置后时间还是不对

  • 安装 NTP 同步时间:sudo apt install ntp
  • 或手动同步:sudo ntpdate time.windows.com

问题3:任务执行了但没有效果

  • 环境变量问题,在脚本开头 export 需要的变量
  • 使用绝对路径,不要用相对路径

参考链接#

Debian时区设置与Crontab定时任务配置
https://im.awsl.app/posts/system-ops/045-debian-timezone-crontab/
作者
uu
发布于
2024-07-10
许可协议
CC0 1.0