替代cron周期执行 Systemd Timers

Systemd timers 提供了一种在 Linux 系统上设置定时任务的方法,与 crontab 类似但提供了一些额外的功能和优势。将 crontab 规则转换为 Systemd timer,需要创建一个 timer 单元文件和服务单元文件。

crontab 规则

[root@slpmivrbgne data]# crontab -l

0 3 * * * cd /data && sh tools.sh -b -c -f > /data/bk.log 2>&1

转为Systemd timer

1. 创建服务单元文件 (tools.service):

这个服务单元文件定义了要执行的脚本和参数。

[Unit]
Description=Run tools.sh script

[Service]
Type=oneshot
ExecStart=/bin/sh /data/tools.sh -b -c -f
RemainAfterExit=true
StandardOutput=journal
StandardError=journal

保存这个文件到 /etc/systemd/system/tools.service
cp tools.service /etc/systemd/system/

2. 创建 timer 单元文件 (tools.timer):

这个 timer 单元文件定义了定时任务的触发频率。

[Unit]
Description=Run tools.sh daily at 3 AM

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true

[Install]
WantedBy=timers.target

保存这个文件到 /etc/systemd/system/tools.timer
cp tools.timer /etc/systemd/system/

3. 启动并启用 timer

创建了服务和 timer 单元文件后,您需要重新加载 Systemd 以识别新的单元文件,然后启动并启用 timer。

systemctl daemon-reload
systemctl start tools.timer
systemctl enable tools.timer

4. 检查 timer 状态

使用以下命令检查 timer 的状态,确保它已被正确设置并启用。

systemctl list-timers | grep tools
systemctl status tools.timer

这个 Systemd timer 将按照提供的 crontab 规则,每天 3 点执行 /data/tools.sh 脚本,并把标准输出和标准错误重定向到 /data/bk.log 文件中。

请注意,StandardOutputStandardError 在 service 文件中设置为 journal,这将把输出记录到 systemd 日志中,您可以通过 journalctl 命令查看。

请根据您的实际需求调整服务单元文件中的 ExecStart 路径和参数。如果需要将输出重定向到文件,您可以在 ExecStart 行中添加重定向操作,例如:

ExecStart=/bin/sh /data/tools.sh -b -c -f > /data/bk.log 2>&1

但请注意,在使用 Systemd 服务时,通常推荐使用 StandardOutputStandardError 选项来控制日志记录,因为这样可以更好地与 Systemd 的日志系统集成。

参考:https://blog.csdn.net/qq_28550263/article/details/139969289

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Golang 中,你可以使用第三方库,如 `robfig/cron` 或 `go-cron/cron` 来实现 cron 作业的延迟执行。 使用 `robfig/cron` 库的示例代码如下: ```go package main import ( "fmt" "time" "github.com/robfig/cron" ) func main() { c := cron.New() // 定义一个 cron 作业 job := cron.NewChain( cron.DelayIfStillRunning(cron.DefaultLogger), ).Then(cron.FuncJob(func() { fmt.Println("Hello, World!") })) // 设置作业的调度规则 schedule := "*/1 * * * * *" // 每秒执行一次 c.AddJob(schedule, job) // 启动 cron 作业 c.Start() // 延迟程序退出 time.Sleep(5 * time.Second) // 停止 cron 作业 c.Stop() } ``` 在上面的示例中,我们使用了 `cron.DelayIfStillRunning` 方法来延迟执行作业,这样即使上一个作业还在执行中,下一个作业也会按计划延迟执行。 另外,如果你使用的是 `go-cron/cron` 库,你可以使用 `cron.Delay` 方法来实现延迟执行。具体代码示例如下: ```go package main import ( "fmt" "time" "github.com/go-cron/cron" ) func main() { c := cron.New() // 定义一个 cron 作业 job := cron.NewChain( cron.Delay(5*time.Second), ).Then(cron.FuncJob(func() { fmt.Println("Hello, World!") })) // 设置作业的调度规则 schedule := "*/1 * * * * *" // 每秒执行一次 c.AddJob(schedule, job) // 启动 cron 作业 c.Start() // 延迟程序退出 time.Sleep(10 * time.Second) // 停止 cron 作业 c.Stop() } ``` 以上是两个常用的库来实现 golang cron 延迟执行的方法,你可以根据自己的实际需求选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值