systemd serviço “oneshot” para acionar o poweroff

1

Mostre um systemd Type=oneshot service que aciona o desligamento do sistema. Por exemplo, isso poderia ser usado para sigpwr.target , para evitar o problema de que sigpwr.target não é iniciado com o modo de trabalho replace-irreversible .

Assegure-se de que o serviçohot não seja eliminado antes de terminar, pois isso causaria uma falha a ser mostrada.

  1. Existe uma possível ordenação em que o systemd para ou mata o seu serviço antes de terminar? Que efeito isso terá, se houver?
  2. Seu serviço também funcionará se for iniciado com o modo de trabalho replace-irreversible ?
por sourcejedi 31.07.2017 / 23:06

1 resposta

1
# trigger-poweroff.service
[Unit]
DefaultDependencies=no
Before=shutdown.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --no-block poweroff

DefaultDependencies=no evita um Conflicts=shutdown.target implícito. Isso significa que não importa se o serviço é iniciado com o modo de trabalho replace-irreversible . Também evita um Wants=sysinit.target implícito; isto seria inferior ao ideal, por ex. se você quisesse iniciar este serviço após a transição para emergency.target .

Before=shutdown.target garante que o serviço termine antes que o desligamento do systemd comece a enviar sinais. Se nada mais, isso torna a unidade mais simples para analisar a correção. Evitamos um impasse certificando-nos de que o serviço também não espere que o desligamento seja concluído.

Não importa se systemd-shutdown matou o processo systemctl com SIGTERM. O processo simplesmente terminaria com o status WIFSIGNAL e um WTERMSIG de SIGTERM . O Systemd trata isso como uma saída limpa e bem-sucedida. Veja a definição de SuccessExitStatus em man systemd.exec . No entanto, se o kernel misteriosamente não agendou essa saída inicial antes do systemd DEFAULT_TIMEOUT_USEC , o systemd-shutdown enviaria o sinal não bloqueado SIGKILL. Systemd não trataria isso como uma saída bem-sucedida.

    
por 31.07.2017 / 23:06