首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Systemd:每15分钟运行一次15分钟的作业

Systemd:每15分钟运行一次15分钟的作业
EN

Unix & Linux用户
提问于 2020-07-01 21:51:07
回答 1查看 219关注 0票数 0

我想要设置脚本和系统定时器,允许24x7转储8个RTSP流到磁盘,15分钟块,每个从四分之一小时开始。

我从一个脚本开始,进行15分钟的转储(我做了一些日期计算和设置,我省略了):

代码语言:javascript
复制
#!/bin/bash
ffmpeg -hide_banner -loglevel error -i $1 -vcodec copy -t 900 -y $2

然后,我为每个流调用这个:

代码语言:javascript
复制
#!/bin/bash
for i in `seq 1 8`; do
  ./dump-rtsp.sh rtsp://address/$i $i.mp4 &
done

我的计时器文件很简单:

代码语言:javascript
复制
[Unit]
Description=Dump streams

[Timer]
OnCalendar=*:0/15

[Install]
WantedBy=timers.target

我的服务--一本小小说:

代码语言:javascript
复制
[Unit]
Description=Dump RTSP for 15 mins

[Service]
Type=forking
ExecStart=/path-to-script/dump-multi.sh 

[Install]
WantedBy=multi-user.target

顺便提一句,我发现& in multi.sh只有在Type设置为分支时才有效。我想这是有道理的,尽管我仍然不明白为什么我们需要对这些事情如此明确(或者说简单和oneshot之间的区别)。但我离题了。

这似乎运行得比较好,但由于计时问题,我发现计时器的后续触发不会启动服务,因为最后一次运行仍在运行,因为它还有一秒钟左右的时间。这也是有意义的,我已经解决了它只抛出899秒。这是一个有点黑客,因为如果有什么,我想要确保连续性和文件在磁盘上有一点重叠。

实际上,我希望shell脚本每15分钟运行一次,如果没有但是。这在Systemd中是可能的吗?也许是允许单位多次触发的选项?我的下一个方法是创建一个由两个不同名称的服务组成的集合(可能使用一个模板)来交替运行,但这似乎有点麻烦。

这更像是一种伪善用法吗?我还很乐意使用一种完全不同的方法(例如,让shell脚本自己执行15分钟循环)。

EN

回答 1

Unix & Linux用户

发布于 2020-07-03 15:57:13

我的新计时器文件现在是:

代码语言:javascript
复制
[Unit]
Description=Dump streams

[Timer]
OnCalendar=*:%i:00
Unit=dump-rtsp@%i.service

[Install]
WantedBy=timers.target

我的服务不需要更改(因为我实际上不需要新的参数),但是在末尾用@重命名它是很重要的,这样就可以调用多个实例。

然后,您可以使用以下方式启动自定义计时器:

代码语言:javascript
复制
sudo systemctl enable dump-rtsp@.timer
sudo systemctl enable dump-rtsp@.service
sudo systemctl start dump-rtsp@00.timer
sudo systemctl start dump-rtsp@15.timer
sudo systemctl start dump-rtsp@30.timer
sudo systemctl start dump-rtsp@45.timer
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/596197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档