
Eu tenho um programa rodando via Systemd e estou tentando descobrir como iniciá-lo/pará-lo em determinados momentos. É um programa persistente (transmissão).
Atualmente tenho um crontab com as seguintes linhas:
0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon
Estou lutando para traduzir isso para um arquivo de timer do Systemd.
Além disso, é possível que o systemd (ou cron) verifique se o serviço deve estar em execução ou não com base na hora atual no caso de uma reinicialização?
Obrigado pela sua ajuda, se isso já foi perguntado antes, indique-me exemplos específicos exatamente desse tipo de coisa. A maior parte do que posso encontrar é como executar um serviço em intervalos de 15 minutos e similares.
Responder1
Pode ser mais simples ter um cronômetro que execute um script uma vez por hora e na reinicialização, e esse script verifique se a hora atual é aquela em que o daemon deveria estar em execução ou não e, se necessário (possivelmente após uma systemctl is-active $service
verificação), inicia ou interrompe o serviço. Este script também pode verificar um arquivo ou atuar em outra lógica de negócios para determinar se as coisas precisam estar em execução ou não, por exemplo, um touch ~/.fooservice-do-not-run
arquivo pode desabilitar coisas ou se a carga é muito alta, etc.
Responder2
Para iniciar serviços por meio de temporizadores no systemd, você usa dois arquivos de unidade. AX.serviçoarquivo para descrever o serviço real e umX.temporizadorarquivo para descrever quando o serviço deve ser iniciado.
Para ativar e desativar um serviço conforme você descreve, o melhor que consigo pensar é ter um serviço separadoXoffpar de arquivos unitários, onde oserviçoarquivos entram em conflito entre si. OXoffservice realmente não faz nada, ele está lá apenas para “executar” quando o serviço real está desligado.
Para se ter uma ideia, aqui está um exemplo de brinquedo com serviçodormirque é ativado a cada minuto par e desativado a cada minuto ímpar.
sleep.service:
[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service
[Service]
ExecStart=/usr/bin/sleep 1d
despertador:
[Unit]
Description=Timer to start the sleep service.
[Timer]
OnCalendar=*:0/2
sleepoff.serviço:
[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