Time
timezone
date -R
timedatectl set-timezone Asia/Shanghai
timedatectl show
clock -w
chrony
# SERVER
# yum install -y chrony
systemctl enable --now chronyd
vim /etc/chrony.conf
server ntp.aliyun.com iburst
# 允许局域网客户端访问
allow 0.0.0.0/0
# 上游不可达时,本地时钟备用
local startum 10
# 时间偏差1.0秒时,前3次跳变调整
makestep 1.0 3
# 将系统时间同步到硬件时钟
rtcsync
systemctl restart chronyd
# chronyc makestep
chronyc sources -v
stratum 10表示优先级足够低,真正上游一般是stratum 1~4
ntp
# yum install -y ntp
vim /etc/ntp.conf
# 默认限制:不允许客户端修改或查询服务器状态
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
# 允许局域网客户端同步
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 上游公网时间源
server 0.pool.ntp.org iburst
# 本地时钟兜底:上游不可达时以本地时钟提供服务
server 127.127.1.0
fudge 127.127.1.0 stratum 10
# 查看同步源
ntpq -p
cron
systemctl status cron.service
创建脚本
/opt/backup.sh
#!/bin/bash
tar -czf /backup/logs-cron-$(date '+%F_%H%M%S').tar.gz /var/log >> /tmp/backup_cron.log 2>&1
备注
最佳实践是在 crontab 中通过调用脚本执行命令,防止符号转义问题
添加执行权限, 属组/属组为当前用户:
chmod au+x /opt/backup.sh
通过 crontab -e 编辑计划任务:
/var/spool/cron/crontabs/USERNAME
* * * * * /opt/backup.sh
| 字符 | 含义 | 示例 |
|---|---|---|
| * | 任意值 | * * * * * 每分钟 |
| , | 列出多个值 | 0,30 * * * * 每小时第0和30分钟 |
| - | 连续范围 | 0 9-18 * * * * 9点到18点的每个整点 |
| / | 步长 | */5 * * * * 每五分钟 |
执行记录查看:
grep CRON /var/log/syslog
Timer
由 systemd 管理的定时任务,service unit 决定如何执行,timer unit 决定何时触发,保证两个 unit 名称相同
/etc/systemd/system/db-backup.service
[Unit]
Description=Daily Database Backup
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
User=hsieh
# 在 ExecStart= 的可执行文件路径前加 +,命令临时以 root 权限执行
ExecStart=+/opt/backup_db.sh
# 资源限制:防止备份任务耗尽系统资源
Nice=10
IOSchedulingClass=idle
# 安全加固:禁止写入系统目录,仅允许写入备份目标路径
ProtectSystem=strict
ReadWritePaths=/backup
PrivateTmp=true
具体执行命令封装在脚本中
/opt/backup_db.sh
#!/bin/bash
tar -czf /backup/logs-timer-$(date '+%F_%H%M%S').tar.gz /var/log
调整执行脚本权限, 设置属主和属组为 root
chown root:root /opt/backup_db.sh
chmod 755 /opt/backup_db.sh
创建相应的 timer unit 配置:
/etc/systemd/system/db-backup.timer
[Unit]
Description=Trigger Daily Database Backup at 02:30
[Timer]
# 每天凌晨 2:30 执行
OnCalendar=*-*-* 02:30:00
# 关键:如果因关机错过执行,开机后补跑一次
Persistent=true
# 随机延迟 0-300 秒,避免多台服务器同时备份造成存储或网络拥塞
RandomizedDelaySec=300
# 将精度设为 1 秒(默认 1 分钟),适合对时间点有要求的任务
AccuracySec=1s
# 显式指定服务(文件名相同可省略)
Unit=db-backup.service
[Install]
WantedBy=timers.target
OnCalendar 用法
Mon..Fri *-*-* *:*:0/5 表示周一到周五,任意日期,任意时间,每隔5秒执行一次
注意
与 cron 不同,OnCalendar 的星期和日期之间是 与 的关系, 而 cron 的星期和日期之间是 或 的关系。
加载以及启动定时任务:
systemctl daemon-reload
systemctl enable --now db-backup.timer
验证
检查 timer unit 配置语法
systemd-analyze verify /etc/systemd/system/db-backup.*
检查 OnCalendar 的时间语法
systemd-analyze calendar "Mon..Fri *-*-* 09:00:00"
查看执行计划:
systemctl list-timers --all db-backup.timer
NEXT 有未来时间说明定时器已生效;LAST 有过去时间说明至少触发过一次。如果 NEXT 显示 n/a,说明定时器没有正常启用。
手动触发一次执行, 测试执行效果:
systemctl start db-backup.service
查看服务执行日志, 是否有 [ERROR] 错误
journalctl -u db-backup.service --since today