[gelöst] Shutdown-Script wo?

  • Hallo LinVDR-Profiis,


    wahrscheinlich stelle ich eine ganz doofe Frage, aber ich weiß mir nicht mehr zu helfen ...


    Ich möchte das Shutdownscript um einige Komponenten von Checkscript.sh ergänzen, um den Shutdown unter bestimmten Bedingungen zu unterbinden.. Habe das auch ausprobiert in der rcShutdown (im Pfad /etc/init.d), von der ich glaubte, es sei das richtige Script. Leider reagiert der Server nicht so wie ich das gerne hätte :(. Es sieht für mich so aus, als würde er meine zusätzlichen Code gar nicht beachten. Bin ich für die LinVDR-Version überhaupt im richtigen Script? Vielleicht kann mir da jemand einen Tipp geben.


    Gruß Stefan


    PS: Der eingefügte Code funktioniert, wenn ich ihn das Script manuell aufrufe.

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

    3 Mal editiert, zuletzt von lueghi ()

  • Also wenn du das Shutdown Script suchst, dann bist du beim rcShutdown schon an der richtigen Adresse.


    Leider kenne ich mich im Scipt selbst nicht so gut aus.
    Habe nur mal ein Shutdownlogo für mein grafisches LCD dort eingebunden.
    Das habe ich unter "export Path" reingeschrieben.


    Vielleicht hilfts dir was.


    Gruß


    Tuxer

    Server
    Software: Debian Lenny, VDR 1.6.0, vdradmin-am, streamdev-server, femon. epgsearch
    Hardware: Chenbro RM314, ABit AV8, AMD64 3200+, 512MB RAM, 4x Seagate 250GB@RAID5, 3ware 8500-4 SATA, Hauppauge dvb-s rev1.6+Nova-S


    Wohnzimmer VDR
    Software: Debian Lenny, VDR 1.6.0, dvd, remote, games, femon, streamdev-client
    Hardware: MSI Hermes 845GL, Hauppauge Nexus-S rev2.1, Nova-T FB, NEC DVD-Brenner

  • Schau Dir mal /usr/bin/poweroff.pl an - das wird von vdr zum Runterfahren des Systems aufgerufen (wir mit '-s /usr/bin/poweroff.pl beim Aufruf von vdr in der runvdr übergeben). Ist aber Perl...


    Pit

    VDR2: ASRock J4105-ITX, DVBSky S952, openSUSE Tumbleweed, VDR 2.4.7

    softhddevice/vaapidevice, DFAtmo, xmltv2vdr, tvscraper, tvguideng, VDRAdmin-AM (alles git, aber alt)

  • Ich rufe checkscript.sh gleich nach "PATH=..." in der Datei rcShutdown auf. Das funktioniert bei mir gut. Ich habe aber glaube ich in checkscript.sh noch ein bischen rumgespielt, sprich was verändert.


    VDR standalone: easyVDR 2.0 Alpha| TT6400
    VDR Server: Intel Atom D945GSEJT | Digital Devices DuoFlex S2 miniPCIe| headless
    Server: ESXi 5.5 mit easyVDR 2 Alpha in virtueller Maschine
    Intel DQ45CB | Q2Q9650 | NAS-Server | Streaming-Server | VompServer
    VDR Clients:
    easyVDR 1.0 mit TT FF
    3x MediaMVP

    [Registered VDR User #823]

  • Zitat

    Original von Der_Pit
    Schau Dir mal /usr/bin/poweroff.pl an - das wird von vdr zum Runterfahren des Systems aufgerufen (wir mit '-s /usr/bin/poweroff.pl beim Aufruf von vdr in der runvdr übergeben). Ist aber Perl...


    Pit


    Ja, genau das ist der Punkt wo ich ansetzen möchte. Danke. Jetzt muss ich nur noch Perl lernen ... :(. Gibt es vielleicht sowas wie selfperl (analog zu selfhtml) zum Selbststudium?


    Gruß Stefan

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Zitat

    Original von VirtuaDZ
    Ich rufe checkscript.sh gleich nach "PATH=..." in der Datei rcShutdown auf. Das funktioniert bei mir gut. Ich habe aber glaube ich in checkscript.sh noch ein bischen rumgespielt, sprich was verändert.


    Aber Du bekommst das Runterfahren doch da nicht mehr abgebrochen, oder? Wenn ich das dort versucht habe, wurde der Rechner immer heruntergefahren, egal ob ich das verhindern wollte oder nicht.


    Gruß Stefan

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Zitat

    Original von lueghi
    Ja, genau das ist der Punkt wo ich ansetzen möchte. Danke. Jetzt muss ich nur noch Perl lernen ... :(.


    War doch gar nicht so schlimm mit Perl. Habe nur 2 Befehler gelernt und schon ist mein Problem gelöst.
    Hätte sich aber auch jemand von euch erbarmen können und mir den Tipp mit system geben können ... :(

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Zitat

    Original von lueghi
    War doch gar nicht so schlimm mit Perl. Habe nur 2 Befehler gelernt und schon ist mein Problem gelöst.


    Oh fein. Poste doch mal das diff hier rein - falls noch jemand die Lösung sucht..


    Zitat

    Hätte sich aber auch jemand von euch erbarmen können und mir den Tipp mit system geben können ... :(


    Aber not me - ich spreche nämlich auch kein Perl :(


    Pit

    VDR2: ASRock J4105-ITX, DVBSky S952, openSUSE Tumbleweed, VDR 2.4.7

    softhddevice/vaapidevice, DFAtmo, xmltv2vdr, tvscraper, tvguideng, VDRAdmin-AM (alles git, aber alt)

  • Zitat

    Original von Der_Pit
    Oh fein. Poste doch mal das diff hier rein - falls noch jemand die Lösung sucht..


    Mit einem diff (was ist das? Schätze die Differenz zweier Dateien; weiß aber nicht wie man das macht) kann ich nicht dienen. Kann nur kurz erläutern, was ich gemacht habe.


    Ich habe die checkscript.sh an meine Verhältnisse angepaßt und lasse noch ein paar log-Zeilen erzeugen. In der poweroff.pl habe ich im Hauptteil nur eine Zeile ergänzt nach der 2. die-Zeile (die "$PROC-ALARM ..."), um das bash-Script checkscript.sh aus dem Perl-Script poweroff.pl heraus aufzurufen:


    die "Abbruch durch checkscript.sh ... \n" if system(/usr/bin/checkscript.sh)


    Das war schon alles. Läuft bis jetzt zu meiner vollsten Zufriedenheit.


    Gruß Stefan


    PS: die 2 Perl-Befehle waren die und system :).

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Zitat

    Original von lueghi
    Ich habe die checkscript.sh an meine Verhältnisse angepaßt und lasse noch ein paar log-Zeilen erzeugen.


    Habe noch vergessen zu erwähnen, dass ich in der checkscript.sh entsprechende exit-codes eingebaut habe, damit poweroff.pl weiß, was im bash-Scirpt passiert ist ...


    Gruß Stefan

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Hallo,
    ich habe bei mir das checkscript aus dem Wiki eingebaut.


    Wenn ich das von der Commandozeile starten, erhalte ich

    Code
    ./checkscript.sh: line 6: test: too many arguments


    Die Zeile sieht so aus:

    Code
    test $5 -eq 0 -a $USERCOUNT -gt 0      && { echo "$USERCOUNT users are logged in."; exit; }


    Anscheined stolpert das Skript über $5.
    Da ich keine Ahnung habe, was da abgefragt wird, frage ich hier mal, was da passieren soll.


  • Die Probleme hatte ich auch.


    hier als Anschauung meine checkscript.sh:


    #!/bin/sh


    logfile=/root/bootlog.txt


    # prüfen auf eingeloggte User
    USERCOUNT=`who|wc -l`
    #if [ $USERCOUNT -gt 1 ]; then
    # date +"%d.%m.%Y %T Uhr" >> $logfile
    # who >> $logfile
    # echo "$USERCOUNT users are logged in, Abbruch shutdown." >> $logfile
    # exit 1
    #fi


    # prüfen auf aktive samba-Verbindungen
    netstat -n|grep "5:139" && {
    date +"%d.%m.%Y %T Uhr" >> $logfile
    echo "SAMBA-Verbindung offen, Abbruch shutdown." >> $logfile
    exit 1
    }


    # prüfen auf aktive ssh-Verbindungen
    netstat -n|grep "5:22" && {
    date +"%d.%m.%Y %T Uhr" >> $logfile
    echo "ssh-Verbindung offen, Abbruch shutdown." >> $logfile
    exit 1
    }


    # prüfen ob DVD-Player aktiv
    ping -c 1 192.168.50.170 >/dev/null && {
    date +"%d.%m.%Y %T Uhr" >> $logfile
    echo "DVD-Player Wohnzimmer aktiv, Abbruch shutdówn. " >> $logfile
    exit 1
    }


    # prüfen auf aktive http-Verbindungen
    netstat -n|grep "5:80" && {
    date +"%d.%m.%Y %T Uhr" >> $logfile
    echo "http-Verbindung offen, Abbruch shutdown." >> $logfile
    exit 1
    }



    echo ende



    hoffe, das hilft weiter.

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Hallo,


    Nach dem ich nochmal das Board durchstöbert habe, konnte ich den Aufruf des Scriptes als kritischen Punkt ausfindig machen.


    Gerne wird dieser Aufruf verwendet:

    Code
    CHECKSCRIPT=/usr/local/bin/checkscript.sh
    
    
    test -x $CHECKSCRIPT && {
        msg=`$CHECKSCRIPT $*`
        test "$msg" != "" && {
            $SVDRPCMD MESG $msg &
            exit 1
        }
    }


    Ich fürchte, das lässt sich nicht in der Form in poweroff.pl einbauen.


    Hat jemand Erfahrung mit sowas?


    lueghi: Auskommentieren geht natürlich auch.


  • Zitat

    Original von Tournevis
    Ich fürchte, das lässt sich nicht in der Form in poweroff.pl einbauen.


    Weiß nicht, ob ich dich richtig verstehe, aber mit dem die-befehl aus Perl kannst Du die checkscript ausführen (siehe meine Mail weiter oben).

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Naja, es ist nicht direkt der "die" Befehl... der bringt das laufende Script zum "Sterben", daher der Name. Es ist mehr der "system"-Befehl, der checkscript.sh ausführt.


    Besser (=durchschaubarer) geschrieben wäre es etwa so:


    if( system(/usr/bin/checkscript.sh)){
    die "Abbruch durch checkscript.sh ... \n"
    }


    d.h. "Wenn checkscript.sh irgend etwas zurückliefert, was als TRUE gewertet wird, dann stirb bitte an dieser Stelle und schreib "Abbruch..." ins Error-Log"
    Wobei "die" eigentlich eher für kritische Abbrüche genutzt wird, ein "exit" würde hier wohl auch ausreichen.


    CHECKSCRIPT=/usr/local/bin/checkscript.sh


    test -x $CHECKSCRIPT && {
    msg=`$CHECKSCRIPT $*`
    test "$msg" != "" && {
    $SVDRPCMD MESG $msg &
    exit 1
    }
    }



    Das heisst nichts anderes als:


    - Überprüfe, ob checkscript.sh existiert und ausführbar ist, falls ja:
    -führe checkscript.sh aus und speichere den Rückgabewert in der Variablen $msg
    - überprüfe, ob der Inhalt (=Rückgabewert) nicht leer ist, falls ja:
    - Gib den Rückgabewert auf dem OSD aus und beende das laufende Script (exit 1)


    Wenn man es sich ganz einfach machen will, könnte man es so in Perl formulieren:


    $CHECKSCRIPT=/usr/local/bin/checkscript.sh


    $msg=`$CHECKSCRIPT $*`;
    if ($msg ne ""){
    system("$SVDRPCMD MESG $msg &");
    exit 1;
    }


    Wichtig ist es, bei $msg=`$CHECKSCRIPT $*`; die "richtigen" Anführungszeichen zu benutzen, nämlich die, die "von links oben nach rechts unten" verlaufen (grave). Diese Konstruktion bewirkt, dass die in diese sogenannten "Backticks" eingeschlossenen Kommandos ausgeführt, und die (eventuellen) Rückgabewerte in der Variable (hier: $msg) gespeichert werden.


    Die alberne Überprüfung, ob checkscript.sh existiert und ausführbar ist, spare ich mir. Wo sollte es denn wohl hin sein? Ich kuck ja auch nicht täglich, ob mein VDR auch wirklich noch im Regal steht, bevor eine Timer-Aufnahme los geht...

  • Hallo und danke für die ausführliche Antwort.


    Ich habe mir mittlerweile selbst helfen können. :]
    Meine Abbruchbedingung in poweroff.pl sieht jetzt so aus:

    Code
    # Checkscript: 
      $MSG=system($CHECKSCRIPT);
      system(sprintf("logger -s \"Abbruch durch checkscript.sh $MSG \n\" ")) if ($MSG!=0);
      die "Abbruch durch checkscript.sh $MSG \n" if  ($MSG!=0);


    Das Abschiessen von Lirc, um via UART den WakeUp zu setzen, habe ich in eine eigene Routine verlagert, die in SetAlarm aufgreufen wird. (ich hatte sonst die Situation, das der VDR zwar noch lief, aber die Fernbedienung war tot... :P)
    Das klappt soweit ganz gut, aber ich habe noch zwei Problemchen:
    1)
    Ich zähle die erfüllten Abbruchbedingungen hoch mit
    exitreason=$((exitreason+1));
    und zum Schluss:
    exit $exitreason;
    Aus einer "3" im Checkscript wird aber in poweroff.pl "768"!? ?(
    2)
    Die Abfrage nach eingelogten Usern klappt nicht!
    a) Auch einige Minuten nach dem Ausloggen werden noch User als eingelogt gemeldet.
    b) Auch wenn keiner eingelogt ist meldet who

    Code
    USER       TTY      IDLE      FROM           HOST


    und who|wc -l ergibt 1, also immer eins mehr als eingelogte User.


  • Zitat

    Original von JoeyBln61
    Naja, es ist nicht direkt der "die" Befehl... der bringt das laufende Script zum "Sterben", daher der Name. Es ist mehr der "system"-Befehl, der checkscript.sh ausführt.


    Besser (=durchschaubarer) geschrieben wäre es etwa so:


    if( system(/usr/bin/checkscript.sh)){
    die "Abbruch durch checkscript.sh ... \n"
    }


    Da gebe ich Dir völlig Recht. Aber ich kann kein Perl und hatte mir das poweroff-Script angesehen. Da war ich schon ganz stolz, dass ich das so hinbekommen habe ....


    Zitat

    Original von JoeyBln61
    d.h. "Wenn checkscript.sh irgend etwas zurückliefert, was als TRUE gewertet wird, dann stirb bitte an dieser Stelle und schreib "Abbruch..." ins Error-Log"
    Wobei "die" eigentlich eher für kritische Abbrüche genutzt wird, ein "exit" würde hier wohl auch ausreichen.


    Das war reines NICHTWISSEN :(. Sorry, wenn ich jemanden damit verwirrt habe.


    Gruß Stefan
    (der, der kein Perl kann ;))

    Gruß Stefan


    LinVDR 0.7 plain vanilla
    der aber an einen Umstieg auf DEBIAN denkt ....

  • Kann das bitte jemand zusammenschreiben wie man das nun am besten löst? Ich weiß leider nicht wo nun was hin soll...

    Bye
    j1mmy


    Hardware 1: Siemens X100
    Gentoo Linux 2.6; FBTV; VDR 1.3.11; Plugins: remote, dvd

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!