使用systemd代替crontab部分功能

2026-10-20 23:02:00
丁国栋
原创 9
摘要:本文记录和讨论使用systemd代替crontab来实现部分定时任务

目前执行应用程序所需的密钥等信息一般是通过环境变量提供的,应用程序执行时从环境变量中读取,这样可以避免将密钥存放在应用程序以及代码库中。

crontab 执行定时任务支持声明环境变量,即在crontab顶部直接使用KEY=VALUE方式定义。如果多个应用程序使用相同的KEY但不同的VALUE无法做到,底部定义的会覆盖上面的。

但如果把敏感信息通过环境变量放到crontab里也不算安全,推荐做法是把环境变量放到文件里,再通过读取文件加载。

有一种做法是使用systemd timer 代替 cron,这样做有以下好处:

1. 支持通过 EnvironmentFile 来加载环境变量,systemd 可以检查文件的权限,如果权限过松会阻止加载;

2. 天然支持日志便于查看执行历史,应用程序的标准输出和标准错误输出可以通过 journald 日志系统记录下载;

3. 支持 ProtectSystem、PrivateTmp 等沙箱参数;

4. systemd支持用户级别的service和timer;

5. 通过 Persistent=true 可以实现开机后再跑一次,避免因为机器关机错过任务;

6. 通过 service 可以定义依赖关系,满足条件后再执行;

7. service 中可以指定用户和用户组执行;


timer 表示不同执行条件:

[Timer]
OnCalendar=*-*-* 02:30:00      # 每天 02:30
OnCalendar=Mon..Fri 09:00:00   # 工作日 09:00
OnCalendar=Sat,Sun 20:00:00    # 周末 20:00
OnCalendar=*-*-01 04:00:00     # 每月 1 号 04:00
OnCalendar=*-*-* 00,12:00:00   # 每天 0 点和 12 点
OnCalendar=*:0/5               # 每 5 分钟
OnCalendar=Mon *-*-1..7 03:00:00     # 每月第一个周一 03:00
OnCalendar=Sun *-*-25..31 02:00:00   # 每月最后一个周日 02:00
同一个timer可以写多个 OnCalendar,任意一条命中即可触发执行 service。

注:可以通过  systemd-analyze calendar "*-*-* 23:59:00" 验证时间表达式是否正确。

注:启用了timer的service不必设置为enabled。


查看 timer: systemctl list-timers |grep xxx

查看 timer 状态:systemctl status xxx.timer


注:Linux家目录下的 .config 目录可以存放应用程序的配置文件;.local/share 存放应用运行时数据、需要持久化存放的数据;

---

发表评论
验证码 =
博客分类