AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 565216
Accepted
Trevor
Trevor
Asked: 2020-02-01 18:30:45 +0800 CST2020-02-01 18:30:45 +0800 CST 2020-02-01 18:30:45 +0800 CST

O comando rsync não funciona quando executado como um serviço systemd

  • 772

resumo:

Estou tentando configurar um timer do systemd para fazer backup regularmente de um diretório usando o rsynccomando. Eu fiz um rsynccomando 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 rsyncpara copiar este diretório para meu SSD para backup (montado em /my_ssd/). Mas eu quero excluir os diretórios dir_ae 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_ae 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 rsynccomando com várias --excludeopções em vez da expansão de chaves, em outras palavras, usei --exclude=/dir_a --exclude=/dir_bem 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 rsynccomando 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.

systemd rsync
  • 1 1 respostas
  • 2025 Views

1 respostas

  • Voted
  1. Best Answer
    Trevor
    2020-02-01T18:30:45+08:002020-02-01T18:30:45+08:00

    Acho que descobri isso sozinho lendo o manual dos serviços do systemd ( man systemd.service). A ExecStart=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 meu rsynccomando para sh -cna ExecStart=linha:

    ExecStart=sh -c 'rsync -a --exclude={/dir_a,/dir_b} /home/trevor/test_dir/ /my_ssd/test_dir/'
    

    referência:

    $ man systemd.service
    ...
           Observe que as linhas de comando do shell não são diretamente suportadas. Se shell
           linhas de comando devem ser usadas, elas precisam ser passadas explicitamente para um
           implementação de shell de algum tipo. Exemplo:
    
               ExecStart=sh -c 'dmesg | tac'
    ...
    
    • 4

relate perguntas

  • systemd: como posso executar um script no início de um serviço, sem editar a definição do serviço

  • Use o suporte de watchdog do systemd para reiniciar o aplicativo

  • Problemas de exclusão de Rsync

  • rsync porta 22 e 873 uso

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve