Como executo um script antes de interromper o uso de cabeçalhos LSB em Raspbian

4

Estou construindo um botão de desligamento para o meu Raspberry pi, e para isso eu tenho um script python que precisa alterar um pino GPIO no meu Raspberry Pi pouco antes do sistema executar o script halt. Agora o Raspbian usa cabeçalhos LSB para determinar a ordem em que os scripts são executados no desligamento, mas não posso, durante a vida, descobrir o que colocar no cabeçalho para que o script seja executado APÓS tudo, exceto /etc/init.d / halt foi executado. O problema agora é que o script é executado muito cedo (sempre é instalado em K01xx), reduzindo assim a energia antes que todos os outros serviços sejam desligados corretamente.

Eu tentei definir uma prioridade personalizada conforme descrito no guia aqui: link , mas isso não faz nada, pois o comando apenas diz "usando o sequenciamento de inicialização baseado em dependência", com o resultado final sendo o mesmo de antes. Eu tentei renomear manualmente o script K01xx em /etc/rc0.d para K09xx, de modo que seria o último antes do comando halt no diretório. Mas isso também não teve efeito. Alguma sugestão?

Meu script init.d:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown
# Required-Start:    
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0
# Short-Description: Detect shutdown button
### END INIT INFO


PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

do_start() {
    if [ -x /home/pi/bin/shutdown.py ]; then
            [ "$VERBOSE" != no ] && log_begin_msg "Starting listening for shutdown button"
        python /home/pi/bin/shutdown.py &
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
        return $ES
    fi
}

do_stop() {
    if [ -x /home/pi/bin/shutdown_pin.py ]; then
        [ "$VERBOSE" != no ] && log_begin_msg "Lowering pin for complete shutdown"
        python /home/pi/bin/shutdown_pin.py
        ES=$?
        [ "$VERBOSE" != no ] && log_end_msg $ES
    fi
}

case "$1" in
    start)
    do_start
        ;;
    restart|reload|force-reload)
        echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
    do_stop
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac
    
por Jens Wegar 23.02.2014 / 20:35

1 resposta

2

/etc/init.d/halt impede a execução do sistema, portanto, nada será executado depois disso. No entanto, supondo que você não esteja fazendo mais nada de mais no desligamento (como ativar a ativação na LAN), deve ser seguro desligar a energia após a execução de /etc/init.d/umountroot . Ele desmonta o sistema de arquivos raiz e, em seguida, remonta-o somente a leitura. Desta forma, os scripts subsequentes podem ser lidos e executados a partir do disco sem risco de corrupção.

Se você olhar em /etc/rc0.d , deverá ver links simbólicos para arquivos em /etc/init.d . No meu sistema, eu tenho:

... /etc/rc0.d/S60umountroot -> /etc/init.d/umountroot /etc/rc0.d/S90halt -> /etc/init.d/halt

Vincule seu script a /etc/rc0.d/S80gpio_poweroff_signal e seu sinal de gpio será enviado depois que o cartão SD for somente para leitura.

Agradecemos a Nate Powell por sua ajuda para responder isso.

    
por 20.09.2014 / 00:10