Systemd를 통해 실행되는 프로그램이 있는데 특정 시간에 이를 시작/중지하는 방법을 알아내려고 합니다. 이것은 영구 프로그램(전송)입니다.
현재 다음 줄을 포함하는 crontab이 있습니다.
0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon
이것을 Systemd 타이머 파일로 변환하려고 합니다.
또한 재부팅 시 systemd(또는 cron)에서 현재 시간을 기준으로 서비스를 실행해야 하는지 확인할 수 있나요?
도움을 주셔서 감사합니다. 이전에 이 질문을 받은 적이 있다면 이와 같은 구체적인 예를 알려주세요. 내가 찾을 수 있는 대부분은 15분 간격으로 서비스를 실행하는 방법 등입니다.
답변1
매 시간마다 그리고 재부팅 시 한 번 스크립트를 실행하는 타이머를 갖는 것이 더 간단할 수 있으며, 해당 스크립트는 현재 시간이 데몬을 실행해야 하는 시간인지 확인한 다음 필요한 경우(아마도 확인 후systemctl is-active $service
) 서비스를 시작하거나 중지합니다. 또한 스크립트는 파일을 검사하거나 다른 비즈니스 논리에 따라 작업을 실행해야 하는지 여부(예: 파일이 touch ~/.fooservice-do-not-run
무언가를 비활성화할 수 있는지 또는 로드가 너무 높은지 등)를 결정할 수 있습니다.
답변2
systemd에서 타이머를 통해 서비스를 시작하려면 두 개의 유닛 파일을 사용해야 합니다.10. 서비스실제 서비스를 설명하는 파일X.타이머서비스가 시작되는 시점을 설명하는 파일입니다.
말씀하신 방식으로 서비스를 켜고 끄려면 별도의 서비스를 마련하는 것이 제가 생각하는 최선의 방법입니다.키오프한 쌍의 유닛 파일, 여기서제공하다파일이 서로 충돌합니다. 이것키오프서비스는 실제로 아무것도 수행하지 않으며 실제 서비스가 종료되는 동안 단지 "실행"됩니다.
아이디어를 제공하기 위해 다음은 서비스가 포함된 장난감 예시입니다.잠짝수 분마다 열리고 홀수 분마다 닫힙니다.
수면.서비스:
[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service
[Service]
ExecStart=/usr/bin/sleep 1d
취침 타이머:
[Unit]
Description=Timer to start the sleep service.
[Timer]
OnCalendar=*:0/2
수면 서비스:
[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service
[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true
취침 타이머:
[Unit]
Description=Timer to stop the sleep service.
[Timer]
OnCalendar=*:1/2