![Bash 스크립트는 정상적으로 다른 스크립트를 호출할 수 없습니다.](https://linux55.com/image/111811/Bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%8A%94%20%EC%A0%95%EC%83%81%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%8B%A4%EB%A5%B8%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%ED%98%B8%EC%B6%9C%ED%95%A0%20%EC%88%98%20%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4..png)
시작 시 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