8つのRTSPストリームを15分単位でディスクに24x7ダンプできるようにスクリプトとシステムタイマーを設定し、各ユニットは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
ところで、dump-multi.shの&は、型が分岐に設定されている場合にのみ機能することを発見しました。意味があると思います。なぜ私たちがなぜこれらのことを明示的にするべきか(または実際に単純さと使い捨ての違い)、なぜそれを明確にするのかはまだ理解されていません。しかし、私は外れた。
タイミングの問題のために最後の実行が約1秒残ったため、まだ実行中であるため、後続のタイマー実行がサービスを開始しないことを除いて、これは比較的うまく機能するようです。これも言葉になりますね。私は899秒だけダンプして問題を解決しました。連続性を確保し、ディスク上のファイルが少し重なるようにするため、これは少しハッキングです。
私は本質的にシェルスクリプトをifsやbutsなしで15分ごとに実行したいと思います。 Systemdでこれは可能ですか?ユニットを複数回発動させるオプションはありますか?次のアプローチは、異なる名前を持つ2つのサービスセットを作成して(おそらくテンプレートを使用して)交互に実行することですが、これもややハッキングされているようです。
これはcronのユースケースに近いですか?また、まったく異なるアプローチ(シェルスクリプト自体に15分ループを実行させることなど)を使用することも嬉しいです。
答え1
私の新しいタイマーファイルは次のとおりです。
[Unit]
Description=Dump streams
[Timer]
OnCalendar=*:%i:00
Unit=dump-rtsp@%i.service
[Install]
WantedBy=timers.target
私のサービスは変更する必要はありません(実際には新しいパラメータは必要ありません)。ただし、複数のインスタンスを呼び出すには、最後に@を使用して名前を変更することが重要です。
その後、次のようにカスタムタイマーを起動できます。
sudo systemctl enable [email protected]
sudo systemctl enable [email protected]
sudo systemctl start [email protected]
sudo systemctl start [email protected]
sudo systemctl start [email protected]
sudo systemctl start [email protected]