Criando um script somente de desligamento com update-rc.d

2

Eu tenho um PI de framboesa executando a distribuição Raspbian padrão. Eu tenho este pequeno programa C que eu preciso executar no final da seqüência de desligamento. Tudo o que ele faz é enviar alguns pulsos lógicos altos em uma saída GIPO para uma fonte de alimentação, informando-a para cortar a energia da placa Raspberry. O script de desligamento deve ser chamado se, e somente se, o sistema estiver sendo desligado, mas não quando o PI estiver sendo reinicializado ou inicializado.

Eu tenho tentado e falhado em usar update-rc.d para fazer isso. A maneira que eu entendo a documentação update-rc.d o que eu tenho que fazer é:

  1. Copie meu executável ( poweroff.bin ), copie-o para / sbin e conceda as permissões necessárias e um cabeçalho LSB:

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides: poweroff
    # Required-Start:
    # Required-Stop:   $all
    # Default-Start:
    # Default-Stop:      0
    # Short-Description: Power off.
    # Description:       Send a power off signal to the PM board.
    # X-Interactive:     false
    ### END INIT INFO
    
    /sbin/poweroff.bin
    
    exit 0
    
  2. Crie um script chamado poweroff em /etc/init.d

  3. Execute o comando sudo update-rc.d poweroff stop 99 0 .

Isso me renderá um script: /etc/rc0.d/K99poweroff , que chamará /sbin/poweroff.bin if e somente se o sistema estiver sendo interrompido.

Eu tenho três perguntas:

  1. Sempre que executo sudo update-rc.d poweroff stop 99 0 . , isso só resulta em um script chamado /etc/rc0.d/K01poweroff sendo criado. O que estou fazendo de errado? o que aconteceu com os 99?
  2. Qual é o significado das opções de início e parada durante o nível de execução 0? Este script deve ser um K99 ou um S99? parece haver pouco sentido em um script de início no nível de execução 0.
  3. O nível de execução 0 é usado apenas ao desligar? Ou seja, se eu fizer um 'shutdown -r now', o computador será enviado para baixo para executar o nível 0 e depois voltar para o runlevel 6?
por os x nerd 30.06.2015 / 01:09

2 respostas

0

A numeração solicitada é ignorada pelos sistemas de meta init baseados em dependência. você tem o errado fornece !. A pista crítica é de outro script. vamos dar uma olhada em umountroot :

### BEGIN INIT INFO
# Provides:          umountroot
# Required-Start:
# Required-Stop:
# Should-Stop:       halt reboot kexec
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Mount the root filesystem read-only.
### END INIT INFO

Vamos olhar atentamente para a linha Should-Stop . observe que isso depende de parada, não de desligamento. Podemos ver isso definitivamente, olhando para o script de parada do debian:

### BEGIN INIT INFO
# Provides:          halt
# Required-Start:
# Required-Stop:
# Default-Start:
# Default-Stop:      0
# Short-Description: Execute the halt command.
# Description:
### END INIT INFO

Observe que o script de atualização ainda não o chamará de K99, mas provavelmente o chamará de algo como o K15, a menos que você tenha um conjunto muito complicado de dependências. mas se você alterar sua linha de fornecimento para parar, isso deve funcionar.

    
por 30.06.2015 / 02:29
0
  1. os scripts de desligamento são numerados ao contrário, portanto, eles serão executados na ordem inversa, portanto, você provavelmente desejará 1 em vez de 99.
  2. a partir de algumas perspectivas, você poderia iniciar serviços no nível de execução 0 se quisesse, mas realmente não quer. (Embora você possa executar o seu script como um começo, mas não consigo me lembrar qual executar primeiro ou parar os scripts.) Como a maioria dos scripts chamados no runlevel 0 também é usada em outros runlevels, você só deseja pará-los. Scripts Snn são chamados com start no runlevel 0.
  3. sim, não. ou para ser mais detalhado antes do gerenciamento automático de energia, o nível de execução 0 era apenas outro nível de execução. A última coisa que você viu ao desligar foi um aviso para ligar o interruptor de energia. Se nesse ponto você pudesse sinalizar uma mudança de nível de execução, você provavelmente poderia fazer o sistema voltar a funcionar. Em computadores com gerenciamento de energia total, o computador desligará como último passo para atingir o nível de execução 0. O nível de execução 6 é semelhante, mas é um nível de execução separado, não há casos de uso padrão para alternar entre os níveis de execução 0 e 6. (É possível tem uma distribuição que usa os runlevels 0 e 6 para usos regulares e relega o desligamento, reinicialize para outros runlevels.)
por 30.06.2015 / 01:46