resumo:
Estou tentando configurar um timer do systemd para fazer backup regularmente de um diretório usando o rsync
comando. Eu fiz um rsync
comando que funciona quando executado manualmente em um terminal, mas não funciona corretamente quando executado como um timer systemd.
explicação detalhada:
Como um exemplo simples, tenho a seguinte árvore de diretórios em /home/trevor/test_dir/
:
dir_a/
file_a.png
dir_b/
file_b.png
dir_c/
file_c.png
Eu quero usar rsync
para copiar este diretório para meu SSD para backup (montado em /my_ssd/
). Mas eu quero excluir os diretórios dir_a
e dir_b
. Então eu executo o comando
rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
Este comando funciona quando eu o executo a partir de um terminal: ele exclui os diretórios dir_a
e dir_b
, mas mantém dir_c
.
Em seguida, tento criar um serviço e timer systemd para executar esse comando rotineiramente (observe que determinei as etapas a seguir principalmente na página systemd/Timers no Arch Linux Wiki). Eu faço o seguinte arquivo de serviço
/etc/systemd/system/backup_test.service
:
[Unit]
Description=systemd backup test
[Service]
Type=simple
ExecStart=rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/
e o seguinte arquivo de timer que executará o comando a cada 30 segundos (por exemplo)
/etc/systemd/system/backup_test.timer
:
[Unit]
Description=systemd backup test timer
[Timer]
OnCalendar=*:*:0/30
Persistent=true
[Install]
WantedBy=timers.target
Eu inicio o cronômetro usando systemctl start backup_test.timer
. O cronômetro é executado a cada 30 segundos, mas a parte "excluir" parece ser ignorada e todo o diretório é copiado.
tentativas de depuração:
Eu tentei o rsync
comando com várias --exclude
opções em vez da expansão de chaves, em outras palavras, usei --exclude=/dir_a --exclude=/dir_b
em vez de --exclude={/dir_a,/dir_b}
. Isso realmente fez o comando funcionar. Então eu acho que o problema é que a expansão do brace não está sendo feita corretamente.
Em seguida, tentei testar um comando mais simples com expansão de chaves, para ver se a própria expansão de chaves era o problema. Então, substituí o rsync
comando no serviço systemd por touch /home/trevor/test{1,2}.txt
. Este comando criou um arquivo literalmente chamado /home/trevor/test{1,2}.txt
. Portanto, tenho certeza de que o problema é que a expansão do brace não é tratada corretamente pelo serviço systemd.
Acho que descobri isso sozinho lendo o manual dos serviços do systemd (
man systemd.service
). AExecStart=
opção não suporta diretamente as linhas de comando do shell, o que acho que é o motivo pelo qual a expansão da chave não estava sendo executada conforme o esperado. Fiz tudo funcionar passando meursync
comando parash -c
naExecStart=
linha:referência: