Bash 스크립트는 정상적으로 다른 스크립트를 호출할 수 없습니다.

Bash 스크립트는 정상적으로 다른 스크립트를 호출할 수 없습니다.

시작 시 init.d 스크립트에서 호출되는 bash 스크립트가 있습니다. 이 스크립트를 여러 번 다시 시작해야 하므로 스크립트가 작동하는지 확인하는 중간 파일을 생성합니다. 내 문제는 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

답변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

관련 정보