Systemd: 15분마다 15분 작업을 실행합니다.

Systemd: 15분마다 15분 작업을 실행합니다.

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에서 이것이 가능합니까? 유닛이 여러 번 발동되도록 하는 옵션이 있을까요? 다음 접근 방식은 서로 다른 이름을 가진 두 개의 서비스 세트를 생성하여(아마도 템플릿을 사용하여) 번갈아 실행하는 것이지만 이 역시 약간 해킹된 것처럼 보입니다.

이것은 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]

관련 정보