Bash скрипт не может вызвать другой скрипт без ошибок

У меня есть сценарий 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
0
18.05.2017, 20:37
1 ответ

Файл, наличие которого вы проверяете перед вызовом функции 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
0
28.01.2020, 04:45

Теги

Похожие вопросы