substituir temporariamente um dos dois temporizadores complementares

1

Para ativar os esquemas de cores claras e escuras, configurei duas unidades que executam um script que cria um link simbólico para meu arquivo de configuração de cupins, quando acionado por seus respectivos timers. O arquivo vinculado contém o esquema claro ou escuro apropriado e, quando o cupim recebe SIGUSR1 , ele recarrega sua configuração. Tudo bem.

$ systemctl --user list-timers
NEXT                         LEFT          LAST                         PASSED  UNIT             ACTIVATES
Mon 2018-11-05 14:20:00 CET  9min left     Mon 2018-11-05 14:10:13 CET  1ms ago brightside.timer brightside.service
Mon 2018-11-05 16:00:00 CET  1h 49min left n/a                          n/a     darkside.timer   darkside.service

$ cat ~/.config/systemd/user/brightside.timer
[Unit]
Description=Ensure a bright colorscheme every ten minutes during the day.

[Timer]
OnCalendar=*-*-* 09..15:0/10

[Install]
WantedBy=timers.target

Portanto, brightside.service links termite_light.conf to ${XDG_CONFIG_HOME}/termite/config a cada 10 minutos durante o dia. Então, darkside.timer assume:

[Timer]
OnCalendar=*-*-* 16..23:0/10
OnCalendar=*-*-* 00..08:0/10

Agora, gostaria de substituir um ou ambos os timers criando ou removendo links simbólicos para ~/.config/systemd/user/{dark,bright}side.d/override.conf usando um script de shell. Em última análise, quero ter uma configuração de temporizador programável como em um temporizador de tomada elétrica. (Mas com a vantagem de mudar a duração do dia sazonal). A ideia aqui é fornecer uma alternância de quatro vias:

  • brilhante [manual]
  • brilhante [automático]
  • escuro [manual]
  • escuro [automático]

Se eu definir o modo dark [automatic] durante o dia, o script primeiro define o esquema escuro. Em seguida, ele deve substituir temporariamente brightside.timer ou interromper o cronômetro para que não voltemos imediatamente. Mas como faço para que no momento em que darkside.timer termine, brightside.d/override.conf seja removido ou brightside.timer seja reiniciado?

Eu usei anteriormente AssertPathExists e arquivos vazios em / tmp para substituir o timer. Talvez essa ainda seja a melhor solução, porque eu provavelmente estaria recarregando o daemon para incorporar o override.conf, não seria?

    
por Bart 05.11.2018 / 14:33

1 resposta

1

Acho que uma opção seria introduzir mais dois temporizadores (e serviços) que seriam disparados uma vez por dia somente nas horas de comutação (9:00 e 16:00) e esses serviços removeriam quaisquer substituições e reativariam temporizadores conforme necessário para remover uma configuração manual e retornar a um automático.

Mas eu realmente acho que você está super engenharia isso até certo ponto ... Embora seja louvável que você esteja conseguindo implementar tudo isso sem um único script de shell e você está fazendo um grande uso dos recursos do systemd, como o especificações de calendário muito flexíveis de unidades temporizadas e a conveniência de substituir arquivos, acho que a codificação do estado do sistema (escuro vs. brilhante, manual vs. automático) no systemd realmente não simplifica sua solução geral.

Como exercício, tente imaginar se suas combinações eram muito maiores. Por exemplo, e se você não tivesse apenas dois esquemas de cores por dia, mas três? Ou se você tivesse quatro esquemas de cores "brilhantes" diferentes, um para cada estação? Ou se você quiser ajustar os horários do switch com base nas horas do nascer / pôr do sol?

Parece-me que ter um único timer + systemd para alternar o esquema de cores seria mais apropriado, fazendo com que esse serviço invocasse um script (shell, python, etc.) que selecionasse o esquema de cores, levando em conta a hora atual, mas também gerenciar substituições existentes (usando arquivos de estado em algum lugar em / run, talvez.)

Esse sistema seria mais simples e muito mais extensível do que você pode construir apenas com unidades systemd.

    
por 07.11.2018 / 07:30