systemd timer para um processo que é executado a cada 5 minutos, mas pode ser executado por mais de 5 minutos

2

Eu fiz uma pequena pesquisa e não vi nenhuma pergunta semelhante.

Eu tenho um trabalho que deve ser executado uma vez a cada cinco minutos.

Deve haver apenas um trabalho sendo executado por vez.

Se o programa levar mais de 5 minutos para ser executado, ele deve ser iniciado imediatamente, sem esperar.

Na maioria das vezes, o trabalho será concluído em menos de um minuto, ocasionalmente, ele deve fazer coisas que podem levar até 20 minutos.

Atualmente, executo esse trabalho como um serviço systemd, e o trabalho é um script de shell que chama o programa real em um loop e dorme entre iterações (5 minutos - último tempo de execução). Isso funciona muito bem.

#!/bin/sh
#
# Sample executable repeat-loop
#
# Run my job in a loop.  If it takes less than max_delay seconds
# to run, sleep until it's time to repeat.  If, for some reason, it took longer, just start
# over again immediately.

max_delay=300                       # maximum delay between runs

# Don't allow multiple copies of this script to run
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@"

restart=0
now=0

while true ; do
    now='date -u '+%s''
    if [ $restart -gt $now ] ; then
        sleep 'expr $restart - $now'
    fi
    restart='expr $now + ${max_delay}'

    echo "my job runs here and may take between 30 seconds and 20 minutes to execute"
done

Desde que eu sou um idiota sangrenta, eu estava pensando que seria ótimo mudar isso para um serviço comum, e ter os temporizadores do sistema disparados.

Eu não consegui descobrir como emular esse comportamento usando OnUnitActiveSec ou OnUnitInactiveSec ...

OnUnitActiveSec vai ativar meu serviço a cada x segundos. OnUnitInactiveSec vai acionar minha própria saudação x segundos depois da última vez que a pessoa foi terminada.

Quaisquer pensamentos além de "Ei, seu script de shell funciona muito bem, por que se bater com um cavalo morto?"

    
por Paul T. 18.05.2016 / 10:01

1 resposta

2

Eu deveria ter testado melhor, em vez de confiar na minha (incorreta) interpretação dos documentos.

Criar um arquivo de timer e usar OnUnitActiveSec apontando para um arquivo de serviço que é Type=simple faz exatamente o que eu quero. O cronômetro será chamado a cada 5 minutos, se o processo for executado por mais de 5 minutos, ele será invocado (quase) imediatamente. Não será invocado duplamente.

É importante usar simple em vez de oneshot (pelos documentos).

    
por 18.05.2016 / 18:11

Tags