
부팅 시 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