Como criar um timer & serviço de backup systemd em 10 segundos

Em nosso post anterior Criar um serviço systemd para seu projeto docker-compose em 10 segundos introduzimos um script que cria automaticamente um serviço systemd para iniciar um projeto baseado em docker-compose. Neste post, mostraremos

Primeiro, você precisa criar um arquivo chamado backup.sh no diretório onde docker-compose.yml está localizado. Este arquivo será rodado pelo serviço systemd todos os dias. O que esse arquivo contém é inteiramente com você e forneceremos exemplos em futuros posts de blog.

Em segundo lugar, rode

create-backup-service.sh
wget -qO- https://techoverflow.net/scripts/create-backup-service.sh | sudo bash /dev/stdin

do diretório onde docker-compose.yml está localizado. Note que o script usará o nome do diretório como nome para o serviço e timer que é criado. Por exemplo, rodar o script em /var/lib/redmine-mydomain fará com que redmine-mydomain-backup seja usado como nome de serviço.

Exemplo de saída do script:

output.txt
Creating systemd service... /etc/systemd/system/redmine-mydomain-backup.service
Creating systemd timer... /etc/systemd/system/redmine-mydomain-backup.timer
Enabling & starting redmine-mydomain-backup.timer
Created symlink /etc/systemd/system/timers.target.wants/redmine-mydomain-backup.timer → /etc/systemd/system/redmine-mydomain-backup.timer.

O script criará /etc/systemd/systemd/redmine-mydomain-backup.service contendo a especificação de o que exatamente rodar:

redmine-mydomain-backup.service
[Unit]
Description=redmine-mydomain-backup

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=/var/lib/redmine-mydomain

e /etc/systemd/systemd/redmine-mydomain-backup.timer contendo a lógica de quando o .service é iniciado:

redmine-mydomain-backup.timer
[Unit]
Description=redmine-mydomain-backup

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

e iniciará e habilitará automaticamente o timer. Isso significa: nenhum passo adicional é necessário após rodar este script!

Para mostrar o status atual do serviço, use e.g.

status.sh
sudo systemctl status redmine-mydomain-backup.timer

Exemplo de saída:

output.txt
● redmine-mydomain-backup.timer - redmine-mydomain-backup
      Loaded: loaded (/etc/systemd/system/redmine-mydomain-backup.timer; enabled; vendor preset: enabled)
      Active: active (waiting) since Thu 2020-12-10 02:50:31 CET; 19min ago
     Trigger: Fri 2020-12-11 00:00:00 CET; 20h left
    Triggers: ● redmine-mydomain-backup.service

Dec 10 02:50:31 myserverhostname systemd[1]: Started redmine-mydomain-backup.

Na linha

output.txt
Trigger: Fri 2020-12-11 00:00:00 CET; 20h left

você pode ver quando o serviço será rodado a seguir. Por padrão, o script gera tarefas que rodam OnCalendar=daily, o que significa que o serviço será rodado às 00:00:00 todos os dias. Confira a página man do systemd.time para mais informações sobre a sintaxe que você pode usar para especificar outros períodos de tempo.

Para rodar o backup imediatamente (ele ainda rodará diariamente após fazer isso), faça

start_backup.sh
sudo systemctl start redmine-mydomain-backup.service

(note que você precisa rodar systemctl start no .service! Rodar systemctl start no .timer apenas habilitará o timer e não rodará o serviço imediatamente).

Para ver os logs, use

journal.sh
sudo journalctl -xfu redmine-mydomain-backup.service

(assim como acima, você precisa rodar journalctl -xfu no .service, não no .timer).

Para desabilitar backups automáticos, use e.g.

disable_timer.sh
sudo systemctl disable redmine-mydomain-backup.timer

Código fonte:

create-backup-service.sh
#!/bin/bash
# Create a systemd service & timer that runs the given backup daily
# by Uli Köhler - https://techoverflow.net
# Licensed as CC0 1.0 Universal
export SERVICENAME=$(basename $(pwd))-backup

export SERVICEFILE=/etc/systemd/system/${SERVICENAME}.service
export TIMERFILE=/etc/systemd/system/${SERVICENAME}.timer

echo "Creating systemd service... $SERVICEFILE"
sudo cat >$SERVICEFILE <<EOF
[Unit]
Description=$SERVICENAME

[Service]
Type=oneshot
ExecStart=/bin/bash backup.sh
WorkingDirectory=$(pwd)
EOF

echo "Creating systemd timer... $TIMERFILE"
sudo cat >$TIMERFILE <<EOF
[Unit]
Description=$SERVICENAME

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
EOF

echo "Enabling & starting $SERVICENAME.timer"
sudo systemctl enable $SERVICENAME.timer
sudo systemctl start $SERVICENAME.timer

Check out similar posts by category: Docker Linux