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!

  • Starter

    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);
        };
    });
    //==========================================================================================================================
  • Starter

    Dann schau mal in die Datei
    /etc/sudoers.d/iobroker


  • OliverIO diese Datei ist leer...

  • Developer

    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!

  • Developer

    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 mit visudo im Ordner /etc/sudoers.d eine eigene Datei, ich nenne sie hier mal custom:

    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 Fall which swapon und which swapoff.
    Zum Speichern und Beenden des Editors, drücke ESCAPE und dann gebe :wq ein, gefolgt von ENTER

  • Starter

    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.

Suggested Topics

1.5k
Online

34.6k
Users

40.7k
Topics

557.5k
Posts