
我有一個 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
答案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