
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에서 타이머를 통해 서비스를 시작하려면 두 개의 단위 파일을 사용합니다. ㅏX.서비스실제 서비스를 설명하는 파일과X.타이머서비스가 시작될 시기를 설명하는 파일입니다.
설명하신 대로 서비스를 켜고 끄려면 제가 생각할 수 있는 최선은 별도의엑스오프단위 파일 쌍, 여기서서비스파일이 서로 충돌합니다. 그만큼엑스오프서비스는 실제로 아무 작업도 수행하지 않으며 실제 서비스가 꺼져 있을 때 "실행"하기 위해 존재합니다.
아이디어를 제공하기 위해 서비스가 포함된 장난감 예가 있습니다.잠짝수 분마다 켜지고 홀수 분마다 꺼집니다.
수면.서비스:
[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service
[Service]
ExecStart=/usr/bin/sleep 1d
sleep.timer:
[Unit]
Description=Timer to start the sleep service.
[Timer]
OnCalendar=*:0/2
sleepoff.service:
[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service
[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true
sleepoff.timer:
[Unit]
Description=Timer to stop the sleep service.
[Timer]
OnCalendar=*:1/2