
起動時に 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 です。
つまり、1 つのファイル (/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