systemd: Como executar um job periodicamente e uma vez no encerramento do sistema?

4

Eu quero executar um trabalho periodicamente (por exemplo, a cada 5 minutos) e, finalmente, uma vez no desligamento do sistema.

O Systemd suporta timers, que podem ser usados para executar um job periodicamente. Ele também suporta a execução de um trabalho no desligamento do sistema usando o gancho ExecStop desta forma:

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=<some command to run at system shutdown>

Mas eu me esforço para combinar as duas abordagens. A única opção que posso pensar é escrever dois serviços independentes:

  1. Um serviço que é acionado por uma tarefa de timer
  2. Outro serviço que usa o truque ExecStop a ser executado no encerramento do sistema

Acho que deveria funcionar, mas há dois problemas com essa abordagem:

  1. Há muita duplicação de código em relação às configurações de segurança
  2. Não há proteção para o systemd contra a execução do trabalho em paralelo. Por exemplo, se o desligamento for disparado enquanto o trabalho periódico foi executado, ambos os trabalhos serão executados em paralelo.

Pergunta:

  • Qual é a melhor maneira de executar um trabalho periodicamente e uma vez no desligamento do sistema?
  • É possível evitar dois arquivos de serviço (principalmente duplicados)?

Para ter uma impressão do que quero dizer com duplicação de código, estas são algumas configurações de segurança que uso ao executar o trabalho:

User=foo
ProtectSystem=strict
ProtectHome=yes
PrivateTmp=yes
ProtectKernelTunables=yes
ProtectKernelModules=yes
ProtectControlGroups=yes
NoNewPrivileges=yes
PrivateDevices=yes
PrivateUsers=yes
CapabilityBoundingSet=
AmbientCapabilities=
SystemCallFilter=~@clock @module @mount @obsolete @raw-io ptrace
ReadOnlyPaths=-/some/path

Na minha abordagem de esboço, eu precisaria duplicar esse código (uma cópia para cada serviço).

    
por Philipp Claßen 05.10.2017 / 13:55

1 resposta

0

Você pode resolver a duplicata criando dois diretórios: foo-at-shutdown.service.d e 'foo-periodic.service.d'.

Em uma pasta, crie um arquivo chamado foo-shared.conf .
Use um link simbólico para adicioná-lo à segunda pasta.

Estas são unidades "drop-in", que serão colocadas nos arquivos de configuração principais. Eles estão documentados mais em man systemd.unit se você procurar por "drop-in" lá.

Acho que ter os dois arquivos de serviço, um arquivo de timer e os arquivos de unidade compartilhada é uma abordagem razoável aqui.

    
por 05.10.2017 / 16:21