Como escrever script de inicialização para o systemd

210

Eu tenho 2 placas gráficas no meu laptop. Um é IGP e outro discreto.

Eu escrevi um script de shell para desativar a placa gráfica discreta.

Como posso convertê-lo em script systemd para executá-lo na inicialização?

    
por Sharique 10.09.2012 / 12:01

1 resposta

295

Existem basicamente duas abordagens para fazer isso:

  • Se você precisar executar um script, não o converterá, mas execute o script por meio de um systemd service.

Portanto, você precisa de dois arquivos: o script e o arquivo .service (arquivo de configuração da unidade). Certifique-se de que seu script é executável e a primeira linha (o shebang ) é #!/bin/sh . Em seguida, crie o arquivo .service em /etc/systemd/system (um arquivo de texto simples, vamos chamá-lo de vgaoff.service ).
Por exemplo:

  1. o script: /usr/bin/vgaoff
  2. o arquivo de unidade: /etc/systemd/system/vgaoff.service

Agora, edite o arquivo da unidade. Seu conteúdo depende de como seu script funciona:

Se vgaoff apenas desligar a GPU, por exemplo:

exec blah-blah pwrOFF etc 

o conteúdo de vgaoff.service deve ser:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff

[Install]
WantedBy=multi-user.target

Se vgaoff for usado para desligar a GPU e também para ligá-la novamente, por exemplo:

start() {
  exec blah-blah pwrOFF etc
}

stop() {
  exec blah-blah pwrON etc
}

case $1 in
  start|stop) "$1" ;;
esac

o conteúdo de vgaoff.service deve ser:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/usr/bin/vgaoff start
ExecStop=/usr/bin/vgaoff stop
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Para os casos mais triviais, você pode fazer sem o script e executar um determinado comando diretamente:

Para desligar:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"

[Install]
WantedBy=multi-user.target

Para desligar e ligar:

[Unit]
Description=Power-off gpu

[Service]
Type=oneshot
ExecStart=/bin/sh -c "echo OFF > /whatever/vga_pwr_gadget/switch"
ExecStop=/bin/sh -c "echo ON > /whatever/vga_pwr_gadget/switch"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Depois de concluir os arquivos, ative o serviço:

systemctl enable vgaoff.service

Ele será iniciado automaticamente na próxima inicialização. Você pode até mesmo ativar e iniciar o serviço de uma só vez com

systemctl enable --now vgaoff.service

a partir de systemd v.220 (em configurações mais antigas, você terá que iniciá-lo manualmente). Para obter mais detalhes, consulte a systemd.service página de manual.

Solução de problemas .
Comece aqui:
Como ver o log completo de um serviço systemd ?
systemd códigos de saída de serviço e explicação de informações de status

    
por 10.09.2012 / 17:21