使用systemd代替crontab部分功能
- 2026-10-20 23:02:00
- 丁国栋
- 原创 9
目前执行应用程序所需的密钥等信息一般是通过环境变量提供的,应用程序执行时从环境变量中读取,这样可以避免将密钥存放在应用程序以及代码库中。
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 存放应用运行时数据、需要持久化存放的数据;
---