
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