У меня есть сценарий bash, который вызывается из сценария init.d при загрузке. Мне нужно сделать несколько перезагрузок для этого скрипта, поэтому я создаю промежуточный файл, который используется для проверки того, должен ли скрипт работать или нет. Моя проблема в том, что в скрипте, который вызывается скриптом init.d (я вроде как новичок в bash, поэтому не уверен, что это технически называется скриптом), этот "скрипт" вызывает другой скрипт, который делает мою фактическую работу, но он никогда не запускается и не выдает ошибку. Это checkversion.sh arg1 arg2. Я направил вывод stderr в файл, который никогда не выдает ошибку. Ошибка возникает, если я специально указываю неправильный путь к файлу. Вы можете видеть, что у меня есть несколько выходных файлов, используемых после вызова скрипта, и они заполняются правильно, так что он получает доступ. Я упускаю что-то очевидное?
Основная структура: /etc/init.d/myupdate вызывает /usr/bin/databases/runcheckversion.sh, который в конечном итоге вызывает /usr/bin/databases/checkversion.sh, но checkversion.sh никогда не выполняется и никаких ошибок не выводится. Думаю, что это может быть связано со спецификацией PATH?
/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
/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
Файл, наличие которого вы проверяете перед вызовом функции after_reboot(): /usr/bin/databases/afterreboot.txt
Однако файл, в который вы выводите 1 ( если вышеуказанный файл не существует): /usr/bin/afterreboot.txt
Похоже, вы создаете один файл (в /usr/bin) и проверяете наличие другого (в /usr/bin/databases ).
Может работать следующее:
#! /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