Execute o script a cada 30 minutos com systemd

19

Gostaria de executar um script a cada 30 minutos após a inicialização no sistema. Eu sei que você pode usar o cron, mas não planejo usar esse recurso com frequência, portanto, gostaria de experimentá-lo com o systemd.

Até agora, encontrei apenas os temporizadores monotônicos que permitem executar algo uma vez (pelo menos acho que sim). Como seria foo.timere se [email protected]eu quisesse executar algo a cada 30 minutos a partir do início do sistema / inicialização?

[email protected]

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???
TomTom
fonte

Respostas:

26

Você precisa criar dois arquivos: um para o serviço e outro para o timer com o mesmo nome.

exemplo:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

depois disso, recarregue o systemd usando o comando systemctl daemon-reloade inicie o cronômetro systemctl start test.timerou ative-o por padrão.

conteúdo de teste de 1.sh

#!/bin/bash
echo `date` >> /tmp/2

E comando para verificar todos os temporizadores disponíveis: systemctl list-timers --all

Informações mais detalhadas na página do projeto e exemplos na página do ArchLinux

Reishin
fonte
systemd aceita os scripts e ela está listada, no entanto nada está acontecendo
TomTom
qual? deve haver dois scripts, um cronômetro e outro serviço. Tempo, quando foi executado pode ser verificado pelo comando list-timers, os erros possíveis poderão ser verificado systemctl status test.timere systemctl status test.servicecomamand
Reishin
1
use o systemctl list-timers --allcomando e verifique a saída. Ele precisa ser como este . Olhe para a unidade, colunas esquerda e passada. Se o timer estiver presente, consulte o arquivo de serviço e verifique se há bugs, pois o timer está funcionando normalmente.
Reishin
1
não, porque a pergunta principal não faz nada sobre "notificar-enviar" e acho que não devemos misturar duas coisas diferentes quando esse tópico já está presente. no seu caso, tente adicionar export DISPLAY=:0.0ao script.
Reishin
1
ps: de acordo com o homem systemd.timer Persistente = verdadeiro só tem um efeito sobre configurado com OnCalendar (isto é wallclock)
snyh
11

Aqui está outra opção sem usar o seu timer. Se o tempo não for muito crítico e o script não demorar muito, será bom para coisas simples.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Matt H
fonte
2
Eu gosto desta solução. A única grande desvantagem é que os logs do sistema serão inundados com logs "Iniciando <service X>" se você reiniciar com frequência (ou seja, a cada 30 segundos). Nesse ponto, talvez seja melhor executar o serviço como um daemon, em vez de reiniciar o serviço várias vezes no systemd.
feijão Camisa
Isso é verdade. Para coisas rápidas e simples, funciona. Mas o cronômetro ou um script de execução longa seria uma solução melhor.
Matt H