O script Bash não consegue chamar outro script sem erro

O script Bash não consegue chamar outro script sem erro

Eu tenho um script bash que é chamado de um script init.d na inicialização. Estou precisando fazer várias reinicializações para este script, então estou criando um arquivo intermediário que é usado para verificar se o script deve estar funcionando ou não. Meu problema é que, no script chamado por um script init.d (meio novo no bash, então não tenho certeza se isso é tecnicamente chamado de script) que "script" chama outro script que faz meu trabalho real, mas nunca é executado e não produz um erro. É checkversion.sh arg1 arg2. Canalizei a saída stderr para um arquivo que nunca recebe um erro. Isso acontece se eu colocar um caminho de arquivo propositalmente incorreto. Você pode ver que tenho alguns arquivos de saída usados ​​​​após a chamada do script e eles são preenchidos corretamente para obter acesso. Estou perdendo algo óbvio?

Estrutura básica: /etc/init.d/myupdate chama /usr/bin/databases/runcheckversion.sh que eventualmente chama /usr/bin/databases/checkversion.sh mas checkversion.sh nunca é executado e nenhum erro é gerado. Pensando que isso pode ter a ver com uma especificação PATH?

Código /etc/init.d/myupdate:

#! /bin/sh
### BEGIN INIT INFO
#Provides: myupdate
### END INIT INFO

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

case "$1" in
    start)
         /usr/bin/databases/runcheckversionwithupdate.sh
         ;;
    stop|restart|reload)
         ;;
esac

Código /usr/bin/databases/runcheckversion.sh:

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

Responder1

O arquivo que você está verificando antes de chamar a função after_reboot() é: /usr/bin/databases/afterreboot.txt

No entanto, o arquivo no qual você está ecoando 1 (se o arquivo acima não existir) é: /usr/bin/afterreboot.txt

Parece que você está criando um arquivo (em/usr/bin) e verificando outro (em/usr/bin/databases).

O seguinte pode funcionar:

#! /bin/sh

after_reboot()
{
   versionNumber=$(< /usr/bin/databases/afterreboot.txt);
   #This following command never executes and theres no error output
   sudo /usr/bin/databases/checkversion.sh $versionNumber /usr/bin/databases/my.db.sqlite 2> didntwork.txt 
  ((versionNumber++));
  echo $versionNumber>/usr/bin/databases/afterreboot.txt;  
}




if [ -f /usr/bin/databases/afterreboot.txt ]; then
    sleep 20
    after_reboot
    checkVersion=$(< /usr/bin/databases/afterreboot.txt)
    if(($checkVersion < 2)); then
    sudo reboot
    fi
    echo "DONE"
else
  echo "1">/usr/bin/databases/afterreboot.txt;
  echo "worked"
  sudo reboot
fi

informação relacionada