NEWS
[Fehler/Frage] Java Script Adapter exec
-
Hi Leute,
ich mache derzeit mit einem eigenen Script fürs Backup rum und wundere mich, dass es nativ ausgeführt super läuft und ich für exec jedoch einige Anpassungen machen musste.
Erstmal das Skript:
! ````
#!/bin/bashdeleteDays: Anzahl Tage nachdem alte Backups gelöscht werden sollen
backupPath: Pfad in den das Backup verschoben werden soll
deleteDays=14
backupPath="/home/pi/iobrokerBackup/"
currentTime="date +%Y_%m_%d-%H_%M_%S
"! cd /opt/iobroker/
! # Wenn "small" übergeben wurde kleines Backup machen, sonst groß
if [ "$1" == "small" ]
then
# kleines Backup erstellen
echo "Kleines Backup wird erstellt"
# ioBroker stoppen
iobroker stop
# Backup erstellen
iobroker backup
# ioBroker starten
iobroker start
# Backups in den gewünschten Ordner ziehen
mv /opt/iobroker/backups/* $backupPath
else
# großes Backup erstellen
echo "Vollständiges Backup wird erstellt"
# ioBroker stoppen
iobroker stop
# Backup erstellen
tar -C /opt/ -czf $backupPath/${currentTime}_fullbackupiobroker.tar.gz iobroker
# ioBroker starten
iobroker start
fi
! # Ältere Backups löschen, nur die der letzten zwei Wochen erhalten
echo "Backup wurde erstellt"
echo "--------------------------------------"
echo "Folgende alte Backups wurden gelöscht:"
find $backupPath -name "*.tar.gz" -mtime +$deleteDays -type f -print -delete
! ````Wenn ich das Skript nativ ausführe, führt er den gewünschten If Block aus sowie anschließend die Löschung der zu alten Backups. Rufe ich das Skript aus iobroker über exec auf, wird nur der jeweilige If-Block ausgeführt, das Backups löschen wird übersprungen. Hatte zuvor den iobroker stop Befehl vor der If-Anweisung, dann hat er über exec nur gestoppt und das wars dann mit Skriptausführung. Kann das Verhalten nicht ganz nachvollziehen. Kann mir jemand das Verhalten erklären oder handelt es sich hierbei gar um einen Fehler?
beste Grüße
fox
-
Hallo,
hast du nachgesehen ob der if block wirklich komplett ausgeführt wird? Ist das Backup wirklich vorhanden?
Gruß
-
hast du nachgesehen ob der if block wirklich komplett ausgeführt wird? Ist das Backup wirklich vorhanden? `
Ja, es hat sich wirklich wie gewünscht verhalten beim lokalen ausführen. Habe das Skript dann mal ergänzt, damit stderr und stdout in ein Logfile geschrieben werden und plötzlich hat es geklappt. Das unterschiedliche Verhalten bleibt mir nach wie vor ein Rätsel, hatte eigentlich Permissions in Verdacht, allerdings hatte jeder betroffene Ordner 777.
Evtl. weißt du was genau der ioBroker für ein Kommando absetzt in die Linux shell? Ein exec aufruf scheint es ja nicht zu sein sondern einfach 1 zu 1 der Befehl, den ich rein schreibe? Und so wie es auf mich gewirkt hat tut er das noch als su, oder?
beste Grüße
Fox
-
Wenn du das Script über die Kommandozeile ausführst ist klar dass es funktioniert - dann läuft es als "eigener Prozess"..
Das Problem ist, dass wenn du im ioBroker Script z.B. exec('bashscript.sh'); aufrufst, dieses Script als Child-Process von ioBroker gestartet wird.
Wenn du jetzt in dem bashscript.sh "stop iobroker" stehen hast, wird auch das bashscript.sh selbst gekillt, weil alle ioBroker Child-Processes beim Beenden von ioBroker gekillt werden.
Deswegen wundert mich eigentlich dass das Script nach der Zeile "iobroker stop" weiter gelaufen ist und das Backup tatsächlich erstellt hat als du es über ein ioBroker Script mit exec(); aufgerufen hast. :lol:
Aber so gut kenne ich mich mit bash scripting nicht aus dass ich dir da genauere Infos zu geben kann. Sorry..
Was mit exec() passiert?
Hier der Code aus Github:
` > import child_process = require("child_process");…....
function exec(command: string, callback?: (err: Error, stdout: string, stderr: string) => void): child_process.ChildProcess; `
Hier die Doku zum verwendeten Modul:https://nodejs.org/api/child_process.html
Gruß
-
Das Problem ist, dass wenn du im ioBroker Script z.B. exec('bashscript.sh'); aufrufst, dieses Script als Child-Process von ioBroker gestartet wird.
Wenn du jetzt in dem bashscript.sh "stop iobroker" stehen hast, wird auch das bashscript.sh selbst gekillt, weil alle ioBroker Child-Processes beim Beenden von ioBroker gekillt werden. `
Ai, ai, ai… danke. Macht Sinn!
Jetzt bin ich eigentlich verwundert, wieso es aktuell über diese Art läuft.
-
Ich auch um ehrlich zu sein.. :lol:
Wie gesagt, kenne mich nicht so gut mit Bash-Scripting aus .. :oops:
Gruß