我想要设置脚本和系统定时器,允许24x7转储8个RTSP流到磁盘,15分钟块,每个从四分之一小时开始。
我从一个脚本开始,进行15分钟的转储(我做了一些日期计算和设置,我省略了):
#!/bin/bash
ffmpeg -hide_banner -loglevel error -i $1 -vcodec copy -t 900 -y $2然后,我为每个流调用这个:
#!/bin/bash
for i in `seq 1 8`; do
./dump-rtsp.sh rtsp://address/$i $i.mp4 &
done我的计时器文件很简单:
[Unit]
Description=Dump streams
[Timer]
OnCalendar=*:0/15
[Install]
WantedBy=timers.target我的服务--一本小小说:
[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分钟循环)。
发布于 2020-07-03 15:57:13
我的新计时器文件现在是:
[Unit]
Description=Dump streams
[Timer]
OnCalendar=*:%i:00
Unit=dump-rtsp@%i.service
[Install]
WantedBy=timers.target我的服务不需要更改(因为我实际上不需要新的参数),但是在末尾用@重命名它是很重要的,这样就可以调用多个实例。
然后,您可以使用以下方式启动自定义计时器:
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.timerhttps://unix.stackexchange.com/questions/596197
复制相似问题