Systemd: Como executar o script apenas no desligamento (não na reinicialização)

6

Há muita solução aqui para executar um script no desligamento / reinicialização, mas quero que meu script seja executado somente no desligamento.

Eu tentei colocar meu script em / usr / lib / systemd / systemd-shutdown, e verifique o parâmetro $ 1, como visto aqui , mas não funciona.

Alguma idéia?

system: archlinux com gnome-shell

$systemctl --version                                                                                                                                                                                 
systemd 229
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
    
por benoit2600 21.05.2016 / 11:14

3 respostas

5

Eu finalmente encontrei como fazer isso.

É um pensamento um tanto hackeado, mas funciona.

Eu usei uma parte deste segmento: link

e este segmento: Como executar um script com systemd logo antes do desligamento?

Eu criei este serviço /etc/systemd/system/shutdown_screen.service

[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Que será executado no shudown / reboot / halt / whatever. (não se esqueça de ativá-lo)

E no meu script /usr/local/bin/shutdown_screen Eu coloquei o seguinte:

#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)    
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1

O qual enviará uma mensagem de desligamento para o meu arduino, que irá desligar minha tela.

    
por 22.05.2016 / 16:05
4

De acordo com o systemd.special man-page, você deve usar Before=poweroff.target .

poweroff.target

A special target unit for shutting down and powering off the system.

Applications wanting to power off the system should start this unit.

runlevel0.target is an alias for this target unit, for compatibility with SysV.

Além disso, como mencionei no meu comentário, você deve colocar scripts personalizados em /etc/systemd/system/ . O diretório /usr/lib/systemd/system/ deve ser usado para scripts fornecidos pelo sistema.

Então, talvez algo assim:

[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target

[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes
    
por 21.05.2016 / 11:47
1

A partir da leitura das respostas aqui parece haver muito mal-entendido sobre como o systemd funciona. Em primeiro lugar, não use conflitos para excluir um alvo. É importante evitar que serviços conflitantes sejam executados ao mesmo tempo.

If a unit has a Conflicts= setting on another unit, starting the former will stop the latter and vice versa.

Unidade significa um arquivo de serviço para iniciar o serviço pericial e não um alvo a ser alcançado. Em outras palavras, Conflicts=reboot.target é insignificante na melhor das hipóteses e, na pior das hipóteses, impedirá a reinicialização. Não faça isso. Isso não significa não executar isso na reinicialização. Significa anular este serviço ou o reboot.target dependendo do tempo e como o systemd interpreta este uso errado de conflitos.

Aqui está um exemplo de uma unidade atualmente configurada (também conhecida como arquivo .service) que é executada apenas no desligamento e não na reinicialização:

[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target

[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=poweroff.target halt.target 

poweroff.target é equivalente ao antigo systemv run level0, que só é alcançado no desligamento. halt.target é um caminho de desligamento alternativo usado pelo systemd que também não pode ser acessado pela reinicialização. A seção de instalação informa ao systemd para adicionar este serviço à lista que deve ser concluída antes que poweroff.target ou halt.target sejam considerados atingidos.

Este serviço está instalado e em execução no meu sistema.

    
por 18.07.2018 / 05:08