NEWS
Gelöst: Exec wird nicht ausgeführt.
-
Kann mir irgend jemand helfen und sagen warum der Excec - Befehl nicht ausgeführt wird? Als Ergebnis bekam ich heute morgen die Mitteilung, "Swap Speicher hatte 56,21 Megabyte und wurde gelöscht". Tatsächlich wurde aber der Swap Speicher nicht gelöscht. Irgendetwas was ich nicht bedacht hatte? In der SSH Shell funktioniert der Befehl einwandfrei!
// Lösche den Speicher täglich um 04:10 schedule('10 4 * * *', function () { value = Math.round(((getState('info.0.sysinfo.memory.info.swapused').val/1024)/1024)*100)/100; // ? swapused in MB if(value > 0){ exec('sudo swapoff -a && swapon -a'); console.log("Swap Speicher hatte "+value+" Megabyte und wurde gelöscht"); } else { console.log("Swap Speicher hatte "+value+" Megabyte und wurde daher NICHT gelöscht"); } });
Danke für Eure Unterstützung!
-
Ich tippe auf Berechtigung.
Musst du in der Shell ein Passwort eingeben?
Mit welchem User arbeitest du in der Shell?
Mit welchem User ruft Iobroker das auf?
Hier kannst du schauen wie man Befehle mit Root Access für Script User berechtigt
https://wiki.ubuntuusers.de/sudo/Konfiguration/ -
Ganz verstehe ich es nicht, denn der EXCEC-Befehl "sudo reboot" funktioniert im folgenden Script ohne Probleme. Der Befehl ist in der viertletzten Zeile:
//Abfrage Server Reboot //========================================================================================================================== // Frage ob der Server tatsächlich neu gestartet werden? on ({id: 'javascript.0.Konversation.ServerInfos.ServerReboot',val:true}, function (obj) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); timeout = setTimeout(function () { //damit auch auf jenem Gerät ausgegeben wird, bei dem die Anfrage eingegangen ist geraet = getState('alexa2.0.History.serialNumber'/*serialNumber*/).val; value = "<speak>Soll ich den Server tatsächlich neu starten?</speak>"; log("Soll ich den Server tatsächlich neu starten?"); ssml_antwort(geraet, value); }, 1500); timeout1 = setTimeout(function () {setState('javascript.0.Konversation.ServerInfos.ServerReboot', false);}, (12000)); }); //War die Antwort innerhalb von 8 Sekunden "ja" on ({id: 'alexa2.0.History.summary',val:"ja"}, function (obj) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); if (getState('javascript.0.Konversation.ServerInfos.ServerReboot').val == true){ timeout = setTimeout(function () { //damit auch auf jenem Gerät ausgegeben wird, bei dem die Anfrage eingegangen ist geraet = getState('alexa2.0.History.serialNumber').val; value = "<speak>OK, Jetzt wird der Server neu gestartet!</speak>"; log("OK, Jetzt wird der Server neu gestartet!"); ssml_antwort(geraet, value); setState('javascript.0.Konversation.ServerInfos.ServerReboot', false); log("Reboot Flag wurde auf false gesetzt"); log("Neustart wird jetzt ausgeführt"); exec('sudo reboot'); }, 2500); }; }); //==========================================================================================================================
-
Dann schau mal in die Datei
/etc/sudoers.d/iobroker -
@OliverIO diese Datei ist leer...
-
@Mauflo Wie alt ist deine Installation? Bei neueren dürfte diese nicht leer sein. Dann ist es tatsächlich ein Berechtigungsproblem. swapoff / swapon ist nicht in der Liste der erlaubten Befehle.
reboot
schon. Wie man das hinzufügt, findest du hier im Forum, wurde schon des öfteren diskutiert.Abgesehen davon solltest du mit deiner Konsolenausgabe warten, bis der Befehl auch tatsächlich ausgeführt wurde - nutze dazu den Callback von
exec
.
Dein Skript versucht den Befehl auszuführen, loggt sofort den Erfolg, aber bekommt gar nicht mit, ob es geklappt hat. -
@AlCalzone , na ja so alt ist sie jetzt nicht. Aber ich finde keine Beschreibung dieser Datei. Kannst Du mir vielleicht einen Link angeben, wo ich infos über die Berechtigungen und der Liste der entsprechenden Befehle bekomme? Und danke für den Tip mit der Konsolenausgabe. War tatsächlich nicht sauber programmiert von mir! Danke!
-
@Mauflo Erscheint eine Ausgabe, wenn du die Datei mit root-Rechten anzeigen lässt?
sudo cat /etc/sudoers.d/iobroker
Deinen Befehl kannst du folgendermaßen erlauben:
Erstelle mitvisudo
im Ordner/etc/sudoers.d
eine eigene Datei, ich nenne sie hier malcustom
:sudo visudo -f /etc/sudoers.d/custom
Füge dort für jeden Befehl, den du erlauben möchtest, folgenden Inhalt ein:
iobroker ALL=(ALL) NOPASSWD: /voller/pfad/zum/erlaubten/befehl
Den vollständigen Pfad kannst du jeweils mit
which befehl
ermitteln, also in deinem Fallwhich swapon
undwhich swapoff
.
Zum Speichern und Beenden des Editors, drücke ESCAPE und dann gebe:wq
ein, gefolgt von ENTER -
Zur genauen Funktionsweise von sudo, sudoers kannst du unter dem link, den ich oben von ubuntuusers gepostet habe, nachlesen. Dann verstehst du auch etwas besser welche linux Mechanismen hier wirken.