
Ich habe ein Bash-Skript, das beim Hochfahren von einem init.d-Skript aufgerufen wird. Ich muss für dieses Skript mehrere Neustarts durchführen, also erstelle ich eine Zwischendatei, mit der überprüft wird, ob das Skript funktionieren sollte oder nicht. Mein Problem ist, dass in dem Skript, das von einem init.d-Skript aufgerufen wird (ich bin ziemlich neu bei Bash, also bin ich mir nicht sicher, ob das technisch gesehen ein Skript ist), dieses „Skript“ ein anderes Skript aufruft, das meine eigentliche Arbeit erledigt, aber nie ausgeführt wird und keinen Fehler erzeugt. Es ist checkversion.sh arg1 arg2. Ich habe die stderr-Ausgabe in eine Datei weitergeleitet, die nie einen Fehler erzeugt. Es passiert, wenn ich absichtlich einen falschen Dateipfad eingebe. Sie können sehen, dass ich nach dem Aufruf des Skripts einige Ausgabedateien verwende und diese korrekt ausgefüllt werden, sodass es Zugriff erhält. Übersehe ich etwas Offensichtliches?
Grundstruktur: /etc/init.d/myupdate ruft /usr/bin/databases/runcheckversion.sh auf, das schließlich /usr/bin/databases/checkversion.sh aufruft, aber checkversion.sh wird nie ausgeführt und es werden keine Fehler ausgegeben. Denken Sie, es könnte mit einer PATH-Spezifikation zu tun haben?
/etc/init.d/myupdate-Code:
#! /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-Code:
#! /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
Antwort1
Die Datei, deren Vorhandensein Sie vor dem Aufruf der Funktion after_reboot() überprüfen, ist: /usr/bin/databases/afterreboot.txt
Die Datei, in die Sie 1 echoen (falls die obige Datei nicht existiert), ist jedoch: /usr/bin/afterreboot.txt
Es sieht also so aus, als ob Sie eine Datei erstellen (in /usr/bin) und nach einer anderen suchen (in /usr/bin/databases).
Folgendes könnte funktionieren:
#! /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