Os comandos no script de inicialização se recusam a executar ou realmente fazer qualquer coisa

2

Edit - Então, acontece que essa linha é a culpada . /lib/lsb/init-functions

Se eu comentar essa linha, os comandos poderão ser executados. Por que isso seria? Eu sou capaz de fonte este arquivo em meus outros scripts de inicialização sem problemas.

Portanto, tenho um script que coloquei em /etc/init.d e execute update-rc.d on. Eu posso rodar isso usando sudo /etc/init.d/usbstorage start , e recebo uma mensagem dizendo que ele foi iniciado, mas nenhum dos comandos tem nenhum efeito. Eu posso verificar isso colocando comandos simples como

echo "here here maytee" > /home/pi/some_file.txt"

no script e depois de executá-lo, esse arquivo não existe. Parte do roteiro é postada abaixo para referência.

#! /bin/sh
### BEGIN INIT INFO
# Provides:          usbstorage
# Required-Start:    $local_fs
# Required-Stop:
# Default-Start:     S
# Default-Stop:      0 6
# Short-Description: Automounts external storage if found.
### END INIT INFO

PATH=/sbin:/bin

. /lib/lsb/init-functions

do_start () {
    umount /dev/sda1 2> /dev/null || echo "sda1 not already mounted"
    mkdir /mnt/usbstorage 2> /dev/null || echo "/mnt/usbstorage already exists"
    mount /dev/sda1 /mnt/usbstorage
    chown -R pi:pi /mnt/usbstorage
    echo "Started usbstorage"
}
do_stop () {
    umount /dev/sda1 || echo "sda1 not already mounted"
}

case "$1" in
  start)
        do_start
        ;;
  restart|reload|force-reload)
    do_stop || echo 1
    do_start
        ;;
  stop|status)
        # No-op
        ;;
  *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac

por que os comandos se recusam a ser executados? É quase como se algo estivesse falhando silenciosamente no começo.

--- Editar

Então eu corri o seguinte:

sudo -i 
bash -x /etc/init.d/usbstorage start

e recebi essa saída

[ ok ] Starting usbstorage (via systemctl): usbstorage.service.
root@johns-box:~# bash -x /etc/init.d/usbstorage start
+ PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
+ . /lib/lsb/init-functions
+++ run-parts --lsbsysinit --list /lib/lsb/init-functions.d
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/20-left-info-blocks ']'
++ . /lib/lsb/init-functions.d/20-left-info-blocks
++ for hook in '$(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null)'
++ '[' -r /lib/lsb/init-functions.d/40-systemd ']'
++ . /lib/lsb/init-functions.d/40-systemd
+++ _use_systemctl=0
+++ '[' -d /run/systemd/system ']'
+++ '[' -n '' ']'
+++ '[' 15898 -ne 1 ']'
+++ '[' -z '' ']'
+++ '[' -z '' ']'
+++ case $(readlink -f "$0") in
++++ readlink -f /etc/init.d/usbstorage
+++ _use_systemctl=1
+++ prog=usbstorage
+++ service=usbstorage.service
++++ systemctl -p CanReload show usbstorage.service
+++ '[' CanReload=no = CanReload=no ']'
+++ '[' start = reload ']'
+++ '[' 1 = 1 ']'
+++ set +e
+++ set +u
+++ '[' xstart = xstart -o xstart = xstop -o xstart = xrestart -o xstart = xreload -o xstart = xforce-reload -o xstart = xstatus ']'
+++ systemctl_redirect /etc/init.d/usbstorage start
+++ local s
+++ local rc
+++ local prog=usbstorage
+++ local command=start
+++ case "$command" in
+++ s='Starting usbstorage (via systemctl)'
+++ service=usbstorage.service
++++ systemctl -p LoadState show usbstorage.service
+++ state=LoadState=loaded
+++ '[' LoadState=loaded = LoadState=masked ']'
+++ '[' start = status ']'
+++ log_daemon_msg 'Starting usbstorage (via systemctl)' usbstorage.service
+++ '[' -z 'Starting usbstorage (via systemctl)' ']'
+++ log_daemon_msg_pre 'Starting usbstorage (via systemctl)' usbstorage.service
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z ']'
+++ FANCYTTY=1
+++ case "$FANCYTTY" in
+++ true
+++ echo -n '[....] '
[....] +++ '[' -z usbstorage.service ']'
+++ echo -n 'Starting usbstorage (via systemctl): usbstorage.service'
Starting usbstorage (via systemctl): usbstorage.service+++ log_daemon_msg_post 'Starting usbstorage (via systemctl)' usbstorage.service
+++ :
+++ /bin/systemctl start usbstorage.service
+++ rc=0
+++ '[' start = status ']'
+++ log_end_msg 0
+++ '[' -z 0 ']'
+++ local retval
+++ retval=0
+++ log_end_msg_pre 0
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z 1 ']'
+++ true
+++ case "$FANCYTTY" in
+++ true
++++ /usr/bin/tput setaf 1
+++ RED=''
++++ /usr/bin/tput setaf 2
+++ GREEN=''
++++ /usr/bin/tput setaf 3
+++ YELLOW=''
++++ /usr/bin/tput op
+++ NORMAL=''
+++ /usr/bin/tput civis
+++ /usr/bin/tput sc
+++ /usr/bin/tput hpa 0
+++ '[' 0 -eq 0 ']'
+++ /bin/echo -ne '[ ok '
[ ok +++ /usr/bin/tput rc
+++ /usr/bin/tput cnorm
+++ log_use_fancy_output
+++ TPUT=/usr/bin/tput
+++ EXPR=/usr/bin/expr
+++ '[' -t 1 ']'
+++ '[' xxterm-256color '!=' x ']'
+++ '[' xxterm-256color '!=' xdumb ']'
+++ '[' -x /usr/bin/tput ']'
+++ '[' -x /usr/bin/expr ']'
+++ /usr/bin/tput hpa 60
+++ /usr/bin/tput setaf 1
+++ '[' -z 1 ']'
+++ true
+++ case "$FANCYTTY" in
+++ true
++++ /usr/bin/tput setaf 1
+++ RED=''
++++ /usr/bin/tput setaf 3
+++ YELLOW=''
++++ /usr/bin/tput op
+++ NORMAL=''
+++ '[' 0 -eq 0 ']'
+++ echo .
.
+++ log_end_msg_post 0
+++ :
+++ return 0
+++ return 0
+++ exit 0
    
por John Allard 27.07.2016 / 23:37

1 resposta

1

TL; DR. Seu script de início não faz nada porque já está "iniciado", diz systemd. Você precisa parar , então você pode iniciar .

Como você pode ver na sua saída de rastreamento do shell, quando você executa

sudo /etc/init.d/usbstorage start

em um SO usando systemd como o gerenciador preferido, que é o seu caso, então a linha

. /lib/lsb/init-functions

em seu script no estilo SysV faz com que o código do shell

/lib/lsb/init-functions.d/40-systemd

para ser executado. Basicamente, você precisa do systemd equivalente ao seu arquivo, então imprime

Starting usbstorage (via systemctl)

então é executado

/bin/systemctl start usbstorage.service

e sai lá. O resto do seu script nunca é executado neste processo específico.

No entanto, cada vez que alguém chama systemctl daemon-reload , todos os scripts /etc/init.d/* são analisados e um pequeno arquivo unit systemd é criado para cada um deles em /run/systemd/generator/ (na inicialização) ou /run/systemd/generator.late/ .

O bloco ### BEGIN INIT INFO comment de cada script é convertido nas dependências equivalentes do systemd. O arquivo de unidade para seu script, usbstorage.service, incluirá essas linhas

RemainAfterExit=yes
ExecStart=/etc/init.d/usbstorage start
ExecStop=/etc/init.d/usbstorage stop

Assim, o/bin/systemctl start usbstorage.service final emitido pouco antes do final da execução do seu script simplesmente executará seu script novamente com arg start , como você acabou de fazer. Desta vez, o ambiente contém _SYSTEMCTL_SKIP_REDIRECT=true , portanto, a inclusão de 40-systemd não causará mais recursão e, em vez disso, seu script será executado normalmente.

Então, por que não faz nada quando você o executa?

Tudo está na linha RemainAfterExit=yes . Isso faz com que o systemd considere o fato de que um start foi feito, e assim quando você emite outro start ele não fará nada, porque ele já está iniciado e "em execução ".

Você precisa primeiro de um stop , então o seu start executará seu script totalmente. Você pode verificar o estado atual do seu serviço, por exemplo:

$ sudo systemctl status usbstorage.service
* usbstorage.service - LSB: Automounts external storage if found.
   Loaded: loaded (/etc/init.d/usbstorage)
   Active: active (exited) since Thu 2016-07-28 15:37:24 CEST; 26min ago
  Process: 7977 ExecStart=/etc/init.d/usbstorage start (code=exited, status=0/SUCCESS)

Jul 28 15:37:23 three usbstorage[7977]: <stdout/stderr of your script>

Observe como ele diz active (exited) . Você pode procurar no log por mensagens com

sudo journalctl -u usbstorage
    
por 28.07.2016 / 16:03