
Notei algumas variações significativas na abordagem em algumas documentações do systemd e documentos de instruções sobre como configurar um ou mais serviços para usar o mesmo temporizador.
Pelo que consegui entender (embora possa estar errado), isso descreveria o que oProcurado poreUnidadeos parâmetros em um arquivo de serviço e timer precisam ser definidos (sem usar exemplos de código reais aqui - para diminuir o comprimento da postagem) para um único serviço e, inversamente, uma configuração de vários serviços usando um único timer:
Temporizador para um único serviço
My.Service1 'WantedBy' Param: N/A (1)
My.Timer 'Unit' Param: My.Service1 (2)
My.Timer 'WantedBy' Param: MultiUser/Basic.Target (3)
(1)O arquivo de serviço não precisa de uma seção [Install] com um parâmetro WantedBy.
(2)Na seção [Timer] do timer o parâmetro Unit deve apontar para o arquivo de serviço My.Service1.
(3)O arquivo do temporizador possui um parâmetro WantedBy que aponta para algum destino especial do sistema que será usado para iniciá-lo.
Temporizador para vários serviços
My.Service1 'WantedBy' Param: Timer.Target (1)
My.Service2 'WantedBy' Param: Timer.Target (1)
My.Service3 'WantedBy' Param: Timer.Target (1)
Timer 'Unit' Param: Timer.Target (2)
Timer 'WantedBy' Param: ???
(1)Todos os serviços precisam se conectar ao mesmo destino definido usando o parâmetro WantedBy.
(2)O parâmetro [Timer] Unit também deve apontar para o alvo.
Para um exemplo da última configuração, consulteeste como fazer. Contarei isso como Exemplo 1. No entanto, encontrei outros exemplos de instruções que se desviam deste (veja abaixo).
Exemplo 2eExemplo 3diga que deve ser configurado assim:
My.Service1 WantedBy: Timer.Target
My.Service2 WantedBy: Timer.Target
My.Service3 WantedBy: Timer.Target
Timer 'Unit' Param: My.Service1 (1)
Timer 'WantedBy' Param: MultiUser/Basic.Target
(1) Isso deve ser um descuido na documentação porque se você deixar a unidade apontando para apenas um de seus múltiplos serviços, os outros serviços não poderão usar o temporizador. Possivelmente, isso se deveu à abordagem "veja acima" utilizada para encaminhar o leitor de volta à configuração de serviço único, sem realmente mencionar (de maneira importante) o que precisava ser alterado.
Então comExemplo 4sua configuração parece que realmente funcionará, mas conecta os serviços ao destino de uma maneira diferente, criando os arquivos de serviço diretamente sob o/etc/systemd/system/Timer.Target.wants/subdiretório e exclui quaisquer parâmetros WantedBy nos arquivos de serviço. Por isso:
My.Service1 'WantedBy' Param: N/A
My.Service2 'WantedBy' Param: N/A
My.Service3 'WantedBy' Param: N/A
Timer 'Unit' Param: Timer.Target
Timer 'WantedBy' Param: MultiUser/Basic.Target
Uma abordagem híbrida entre os Exemplos 1 e 4 que vi é criar os arquivos de serviço no/etc/systemd/system/diretório (o local padrão) e para criar um link simbólico para esses arquivos de serviço sob o/etc/systemd/system/Timer.Target.wantsarquivo eexcluirum parâmetro WantedBy no arquivo de serviço (que é funcionalmente equivalente ao Exemplo 4), enquanto outra configuração usa o método de link simbólico, mas também inclui o parâmetro WantedBy no arquivo de serviço (que parece redundante e desnecessário).
Minha pergunta seria esta para o Exemplo 4 e abordagens híbridas: Por que colocar algo sob um*.querserá necessário se a declaração de um parâmetro WantedBy instruir o systemd a fazer isso por você (conforme indicado na explicação desse parâmetro emesta página)?
Alguém pode esclarecer a melhor maneira de configurar vários serviços usando o mesmo temporizador em meio à confusa multiplicidade de abordagens para fazer isso?
Responder1
Se você deseja ativar vários serviços com um único temporizador, insira um alvo entre eles:
A unidade do temporizador, vamos chamá-la foo.timer
:
[Unit]
Description=My timer that runs saturdays, 9am and triggers foo.target
Wants=foo.target
[Timer]
OnCalendar=Sat 9:00
Unit=foo.target
[Install]
WantedBy=timers.target
A unidade alvo, vamos chamá-la foo.target
:
[Unit]
Description=My target unit, that groups my two services xxx.service and yyy.service
Wants=xxx.service yyy.service
After=xxx.service yyy.service
[Install]
Also=foo.timer
E então os dois serviços xxx.service
e yyy.service
:
[Unit]
Description=My service XXX
[Service]
ExecStart=/bin/echo I am XXX
[Install]
Also=foo.timer
[Unit]
Description=My service YYY
[Service]
ExecStart=/bin/echo I am YYYY
[Install]
Also=foo.timer
Copie esses quatro arquivos de unidade ( foo.timer
, foo.target
, xxx.service
, yyy.service
) para /etc/systemd/systemd/
. Em seguida, habilite e inicie o cronômetro executando:
systemctl enable --now foo.timer`
Isso se conectará foo.timer
ao timers.target
, que é o alvo genérico que deve extrair todos os vários temporizadores definidos em um sistema.
Observe que você também poderia fazer systemctl enable foo.target
isso, e também systemctl enable zzz.service
, já que as Also=
linhas nessas unidades propagam as solicitações de ativação para foo.timer
.
Responder2
Um temporizador systemd sempre ativa uma unidade.
Se você deseja ativar duas unidades na mesma programação, recomendo criar dois arquivos de temporizador para maior clareza que contenham a mesma programação.
Caso contrário, você poderá criar um arquivo de "unidade de serviço" que inicie os dois serviços desejados.
Não creio que "WantedBy=" seja um conceito particularmente útil para unidades de temporizador.