Execute o Script uma vez por dia com systemd

13

Quero executar um script de backup 10 minutos após inicializar minha máquina, mas apenas uma vez por dia. É possível criar esses cenários com o systemd?

Fu86
fonte
3
Não entendo completamente seus requisitos, por favor, esclareça. Entendo que, se você reiniciar o servidor em um dia, o script deverá ser executado somente após a primeira reinicialização, certo? Se sua máquina funcionar por mais de um dia, o script deve ser executado em dias consecutivos?
Krzysztof Adamski
Exatamente. Farei um backup todos os dias, não importa quantas vezes eu reinicie o meu PC.
Fu86 14/09/12
5
Se você não está desconectado do systemd, é exatamente para isso que serve a anacron.
Gilles 'SO- stop be evil'
Posso estar errado, mas não há uma maneira fácil de configurar o anacron para executar o script apenas 10 minutos após a conclusão da inicialização.
Krzysztof Adamski
Está certo. É por isso que eu estou usando atualmente anacron e o bom e velho a, com um trabalho diário comoecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Respostas:

10

Veja /lib/systemd/system/systemd-tmpfiles-clean.timer:

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Isso executa o .servicearquivo correspondente 15 minutos após a inicialização e todos os dias enquanto o sistema está ativo. Se você reiniciar várias vezes no mesmo dia, poderá fazer com que o script de backup verifique o horário do arquivo morto e pule a execução se tiver menos de um dia.

Além disso, se seus backups exigirem muito IO, pode ser útil ler sobre as diretivas IOScheduling * na página de manual systemd.exec (5) .

Craig
fonte
5

Eu não acho que é possível fazer isso totalmente no systemd, pois não controla nenhum estado entre as reinicializações. Você pode agendar facilmente algo para ser executado 10 minutos após o uso da inicialização systemd.timere seu OnBootSec=ou OnStartupSec=.

O próprio script deve verificar se ele já foi executado hoje ou não. Isso pode ser facilmente implementado mesmo no bash, por exemplo:

#/bin/sh -x
FILE=/etc/lastrun
TODAY=`date +"%Y%m%d"`
LASTRUN=`cat $FILE`

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE
Krzysztof Adamski
fonte
1

Se você não desligar 10 minutos após a inicialização, pode:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailyfaz com que seja executado toda meia-noite, Persisten=truena inicialização, se houver pelo menos uma execução perdida.

x-yuri
fonte
0

Aparentemente, esse problema será abordado em versões futuras. Pelo menos de acordo com este e-mail na lista de discussão systemd-devel. Até que você tenha que seguir o caminho hackeado que Krzysztof propôs.

mmh
fonte