Linux怎么使用systemd-timer_Linux如何替代crontab定时【教程】

千丽小哥_2951

千丽小哥_2951

2026-03-31

153人浏览

原创

systemd-timer 能替代 crontab,但需手动处理环境变量、权限、路径、shell 特性等隐式依赖,否则易静默失败;必须配对 timer/service 单元文件,显式声明 path、workingdirectory 等,并用 journalctl 查日志。

linux怎么使用systemd-timer_linux如何替代crontab定时【教程】

systemd-timer 能不能直接替代 crontab

能,但不是“一换就跑”,尤其涉及环境变量、用户权限、路径解析时容易静默失败。systemd-timer 不读 /etc/crontab,也不自动加载用户的 crontab -e 条目,它只认自己那一套 unit 文件。

常见错误现象:systemctl start myjob.timer 显示 active,但 myjob.service 从不执行;或执行了但日志里报 Command not found——多半是 PATH 没继承、shell 特性不兼容、或工作目录不对。

  • crontab 默认用 /bin/sh 解析命令,而 systemd service 默认不走 shell,ExecStart=echo $HOME | mail -s "hi" user 会失败(变量不展开、管道不生效)
  • 用户级 timer 必须放在 ~/.config/systemd/user/,且需先运行 systemctl --user daemon-reload,否则 systemctl --user list-timers 看不见
  • root 级 timer 的 EnvironmentFile=Environment= 必须显式声明,不会自动加载 /etc/environment 或用户的 ~/.bashrc

写一个最简可用的 daily backup.timer

核心是两个文件配对:timer + service。timer 只管“什么时候触发”,service 管“具体干什么”。两者必须同名(不含后缀),且 service 类型必须是 Type=oneshot

示例:每天凌晨 2:15 执行备份脚本 /usr/local/bin/backup.sh

[Unit]
Description=Daily backup
<p>[Timer]
OnCalendar=<em>-</em>-* 02:15:00
Persistent=true</p><p>[Install]
WantedBy=timers.target</p>

对应 backup.service

[Unit]
Description=Run backup script
<p>[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh</p><h1>关键:显式指定环境和工作目录</h1><p>Environment="PATH=/usr/local/bin:/usr/bin:/bin"
WorkingDirectory=/root</p><h1>防止因脚本 exit code 非 0 导致 timer 停摆(默认行为)</h1><p>RemainAfterExit=yes</p>
  • Persistent=true 表示:如果机器关机错过触发时间,开机后立刻补执行一次(类似 cron 的 @reboot + 时间补偿)
  • OnCalendar 支持多种格式,但避免用 hourly 这类模糊词——它实际对应 *-*-* *:00:00,可能和你预期的“每小时整点”有偏差
  • 不要在 ExecStart= 里写 sh -c "xxx" 来兼容 bash 特性,应把逻辑移到脚本里,保持 service 定义干净

systemd-timer 日志怎么看、怎么调

出问题时别翻 /var/log/syslog,直接用 journal:

  • 查 timer 状态:systemctl list-timers --all(注意看 LEFTUNIT 列)
  • 查某次执行是否成功:journalctl -u backup.service --since "2 hours ago"
  • 查 timer 本身有没有报错(比如语法错):journalctl -u backup.timer
  • 如果 service 启动就退出,加 StandardOutput=journal+consoleStandardError=journal+console 把输出也刷进 journal

注意:journalctl 默认只存当前 boot 的日志。如需跨重启查,确保 /var/log/journal/ 目录存在且 Storage=persistent/etc/systemd/journald.conf 中已启用。

crontab 里带 % 的行怎么转成 systemd

crontab 的 % 表示换行并把后续内容作为标准输入传给命令,systemd 没这机制。必须拆解:

原 crontab 行:0 3 * * * echo "report" | mail -s "daily" admin@example.com

错误写法:ExecStart=/bin/sh -c 'echo "report" | mail -s "daily" admin@example.com'mail 可能收不到 stdin)

正确做法是写个 wrapper 脚本,或用 ExecStartPre + 临时文件:

[Service]
Type=oneshot
ExecStartPre=/bin/sh -c 'echo "report" > /tmp/mail-body.txt'
ExecStart=/usr/bin/mail -s "daily" admin@example.com 
  • 别依赖 /tmp 持久性,ExecStartPost 必须清理,否则下次执行会读到旧内容
  • 更稳妥的方式是把整个逻辑封装进独立脚本,service 只调用它——这样调试、权限、环境都可控
  • systemd 对重定向(、<code>>>)支持有限,复杂 IO 流程一律交给脚本处理

真正麻烦的从来不是语法转换,而是 cron 里那些隐式依赖:当前 shell、用户 HOME、ssh-agent、dbus session、甚至某个挂载点是否就绪。这些全得手动补全,漏一条,timer 就哑火。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

2023.10.17

580

4

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

2023.10.18

856

5

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

2025.08.19

1726

14

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

2023.08.08

756

5

console.log是什么
console.log是什么

console.log 是 javascript 函数,用于在浏览器控制台中输出信息,便于调试和故障排除。想了解更多console.log的相关内容,可以阅读本专题下面的文章。

2024.05.29

5163

7

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

3570

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3113

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2153

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

5130

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.1万人学习