Tenho algumas coisas que não quero atualizar enquanto minha sessão gráfica estiver em execução, mas ficaria feliz em atualizá-las no desligamento (depois que minha sessão gráfica terminar, enquanto a rede ainda estiver ativa), uma vez . Portanto, não quero escrever um arquivo de serviço, habilitá-lo e executá-lo a cada desligamento.
Agora, pensei, OK, systemd-run
para o resgate:
systemd-run \
--property=Type=oneshot \
--property=DefaultDependencies=no \
--property=Requires=network.service \
--property=WantedBy=shutdown.target \
/usr/bin/dnf5 update -y package1 packge2…
Mas isso falha com
Failed to start transient service unit: Dependency type WantedBy may not be created transiently.
Existe outra maneira de fazer isso?
Este comando baseia-se numa extrapolação e adaptação para o caso em questão de uma resposta minha no Ask Ubuntu, que converti em
systemd-run
comando. A resposta extrapolada e adaptada, útil para compreender o raciocÃnio por trás do comando e útil para configurá-lo como serviço permanente e não como uma unidade transitória, é relatada abaixo.Observe que isso será executado no desligamento e não na reinicialização . Isso é intencional. Se isso for indesejado e você quiser executá-lo ao desligar e reinicializar, simplesmente substitua a
ExecStop
propriedade por apenasdnf5 update -y package1
.Substitua
package1
de acordo com as necessidades.O que minha pesquisa me ensinou é que:
oneshot
serviço logo apósnetwork-online.target
ter subido, ao mesmo tempo marcando-o como ativo, usandoRemainAfterExit=true
e fornecendo-lhe umExecStop
ação que será acionada "naturalmente" quando o sistema cair, logo antes da rede cair.poweroff.target
estará ativo apenas caso o sistema esteja desligado para desligar.Então, juntando tudo, isso poderia ser feito criando um serviço
/etc/systemd/system/update.service
(o nome do arquivo e os camposDescription
eExecStop
, é claro, podem ser ajustados; certifique-se de que o arquivo seja de propriedaderoot:root
e tenha644
/-rw-r--r--
permissões):Uma vez feito isso, execute
sudo systemctl enable --now update.service
para habilitar o serviço.TimeoutStopSec=infinity
é obviamente necessário no caso de uma atualização, mas pode ser alterado caso você queira usá-lo para outra coisa.Pedi a @TomYan para converter seu comentário em uma resposta; infelizmente, eles não o fizeram e então minha recompensa vai cair por terra. De qualquer forma:
Uma abordagem aqui é explorar o fato de que as unidades podem ter comandos que são executados na saÃda; então, um serviço com
Type=oneshot
ExecStart
(como /usr/bin/true) (ou nenhum se especificado através do arquivo de unidade)RemainAfterExit=true
(para marcá-lo como ainda vivo mesmo que o manequim tenha saÃdo)ExecStop=
que executa o comando que eu precisoAfter=network.target
para garantir que esta unidade seja parada antes que a rede seja parada (especifica que deve ser iniciada depois, mas parada antes)deve funcionar e ser interrompido no desligamento se for iniciado uma vez.
Percebi que o tempo limite de parada pode ser um problema, mas não é mais um problema tão ruim, porque a partir do systemd 188 é possÃvel configurar
TimeoutStopSec=
um serviço.Para uma atualização única , tente um at-job.De outra forma:
Para sistemas do tipo Debian, instalar e configurar
unattended-upgrades
seria o caminho a percorrer. Oferece a opção de instalação no desligamento.O equivalente do Redhat seria
dnf-automatic
.Ambos fazem uso de temporizadores do systemd.
Se você não quiser atualizar pacotes especÃficos, você pode fixá-los/segurá-los.