TVheadend Power safe script

  • Hi!


    Ich hab im Internet ein nettes Script gefunden, dass meine Qnap 253 pro entsprechend der programmierten Aufnahmen automatisch hoch und runterfahren soll.


    https://tvheadend.org/boards/4/topics/15826


    (Es ist das 2. Script)


    Leider funktioniert das Script nicht auf meiner Qnap:



    Bash
    #!/bin/bash# BASIC SETTINGS change at wish# Settings you have to look at# TvHeadend login and passwordtvh_login=YOUR_LOGIN_NAMEtvh_password=YOUR_PASSWORD# (post recording) process activity to be checked, leave blank to deactivateprocess_check=(PROCESS_A PROCESS_B)# Settings you might look at# portnumbers to be checked for user activity (tvheadend 9981 + 9982 and samba 445)port_numbers=(9981 9982 445)# minimum time in seconds needed for consecutive shutdown AND startupsafe_margin_shutdown=600# minimum time in seconds needed to start up the computer properlysafe_margin_startup=180# minimum time in minutes not to shutdown after last user activity (watching tv/recording, up-/downloading files, booting the system)idle_time_shutdown=30# maximum time in hours not to wake up for updating EPGepg_hours=48# interval in seconds the script will check if the system should be shutdownscript_int=60# END OF BASIC SETTINGS keep out from here ;-)# retrieve IP_address tvheadend servertvh_ip=$(hostname -i | awk '{print $1}')# set languageexport LANG=C# set session startuptime_boot_sec=$(cat /proc/uptime | awk -F ' ' '{print$1}' | awk -F '.' '{print$1}')boot_time=$(($(date +%s)-uptime_boot_sec))# initial values do not changerecording=1# check for shutdownuntil [ $recording -eq 0 ];do# initial values do not changerecording=0shutdown_timer=$idle_time_shutdownping_array=()# countdown to shutdownuntil [ $shutdown_timer -eq 0 ];doshutdown_timer=$((shutdown_timer-1))# check for server connection tvheadend samba or any other server according to settings abovestatus_netstat=1until [ $status_netstat -eq 0 ];dostatus_netstat=0sleep $script_intfor i in $( echo "${port_numbers}"); doport_no=$ifor i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); doshutdown_timer=$idle_time_shutdownstatus_netstat=1ping_array[$(echo "${#ping_array}")]=$idonedoneping_array=($(echo "${ping_array}" | sed 's/[ ]/\n/g' | awk '!a[$0]++' ))donefor i in $(echo "${ping_array}"); doif [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; thenping_array=($(echo "${ping_array/$i/}"))fidoneif [ $(echo "${#ping_array}") -eq 0 -a $boot_time -lt $(($(date +%s)-idle_time_shutdown*60)) ]; thenshutdown_timer=0fiif [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; thenshutdown_timer=1fidone# check for active post recording processestotal_processes=0for i in $( echo "${process_check}"); docounter=$( ps -A | grep "$i" | wc -l )total_processes=$((total_processes+counter))doneif [ $total_processes -ne 0 ]; thenrecording=$((recording+1))fi# check for active usersif [ $(who | wc -l) -ne 0 ]; thenrecording=$((recording+1))fi# retrieve and calculate wake up dataif [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -eq 0 ]; thenwake_after_min=$((epg_hours*60))if [ $(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}' | wc -l) -gt 0 ]; thenwake_after_min_temp=$(curl -s --user $tvh_login:$tvh_password 127.0.0.1:9981/status.xml | grep "next" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}')if [ $wake_after_min -gt $wake_after_min_temp ]; thenwake_after_min=$wake_after_min_tempfifielsewake_after_min=0fiwake_after_secs=$((wake_after_min*60))# check safe margin shutdownif [ $safe_margin_shutdown -gt $wake_after_secs ]; thenrecording=$((recording+1))fidone# set RTC wake up timestop_date=$(date +%s)wake_date=$((stop_date+wake_after_secs-safe_margin_startup))echo 0 > /sys/class/rtc/rtc0/wakealarmecho $wake_date > /sys/class/rtc/rtc0/wakealarm# shutdown computersudo shutdown -h now


    Aktuell hänge ich bei Zeile 46


    Da wird mir ein Syntax Error ausgegeben.


    Bin leider ein Linux Neuling. Kann mir jemand helfen das zu fixen? - Ich denke an dem Code hätte mehr Leute interesse.


    Danke und LG

  • Ich bin gerade nicht mehr ganz fit, bei dem Thema. Aber wenn man Scripte aus dem Internet kopiert, gibt es häufig Probleme mit den den einfachen Anführungszeichen. Oft sind es die falschen und man muss sie durch die richtigen ersetzten.


    Frag mich jetzt aber bitte nicht welches das richitge ist, ich muss das auch immer durch probieren.


    Was steht denn beim Syntax Error genau?

  • Ich bekomme folgende Meldung:


    Debug.sh: line 47: syntax error near unexpected token `do'
    Debug.sh: line 47: ` for i in $( echo "${port_numbers[*]}"); do'


    LG

  • Ich bin mir zwar gerade nicht mehr sicher ob das in der shell der Fall war, manche Programmiersprachen reagieren auch komisch auf bestimmte leerzeichen. Mach mal das vor dem echo raus.

  • Hab das Leerzeichen vor dem Echo rausgemacht, sowie auch noch das vor dem do.


    Fehlermeldung ändert sich nicht wirklich:


    ebug.sh: line 47: syntax error near unexpected token `do'
    Debug.sh: line 47: ` for i in $(echo "${port_numbers}");do'


    mit Leerzeichen vor dem do


    ebug.sh: line 47: syntax error near unexpected token `do'
    Debug.sh: line 47: ` for i in $(echo "${port_numbers[*]}"); do'

  • Ich hab mal ein paar Zeilenschaltungen weggenommen


    Jetzt bekomm ich folgenden Fehler:


    Debug.sh: line 105: syntax error: unexpected end of file

  • Gibt es nicht, ändert aber auch nichts. Anscheinend versteht das QNAP den Befehl


    sudo shutdown -h now


    nicht.


    Für sudo funktioniert über SSH auch nicht...

  • Das mit sudo ist natürlich klar, es gibt kein sudo und braucht es auch nicht.


    Du könntest shutdown -h now durch shutdown -h 0 ersetzten

  • wenn du das Skript wie oben ausführst, kann es auch zu Fehlverhalten kommen, weil in der ersten Zeile, der sogenannten "Shebang", der falsche Pfad zur bash angegeben ist. Wenn du das Skript auf der abgespeckten Variante der Shell, die Standardmä´ßig auf dem NAS installiert ist ausführen möchtest muss da

    Bash
    #!/bin/sh


    hin. Besser wäre es jedoch via entware eine "richtige" Version der Bash zu installieren und dann in der Shebang:

    Bash
    #!/opt/bin/bash


    einzutragen.

  • '!/bin/sh


    War mal die Lösung, gemeinsam mit einer End of Line Konversion.


    Jetzt läuft


    Bash - n Debug.sh


    Ohne fehler durch.


    Neues Problem:


    Ich bekomme einen Fehler für netstat:


    for i in $(echo $(netstat -n | grep -i "ESTABLISHED" | grep "$tvh_ip:$port_no" | awk -F ':' '{print ":"$2}' | sed 's/:'$port_no'\|[ ]//g')); do


    Fehlermeldung:


    Code
    netstat: no support for `AF INET6 (tcp)' on this system.
    netstat: no support for `AF INET6 (udp)' on this system.
    netstat: no support for `AF INET6 (raw)' on this system.


    Damit kann ich ersmal nichts anfangen...

  • Ist netstat denn installiert? Meines wissens nach muss das auch erst via entware nachinstalliert werden. Poste mal die Ausgabe von which netstat

  • die Stations haben netstat an Bord. Ob das ausreichend ist?
    Entware-ng hat auch etwas

    Code
    net-tools-netstat - 1.60-4 - Program netstat from net-tools. Report network connections, routing tables, and interface statistics.

    Das mal installieren und im script auf /opt/bin/netstat weisen.

  • Ich bekomm leider die selbe Fehlermeldungen wenn ich in Putty nur netstat ausführe.


    Ist also kein Bug im Code.


    Den Fehler bekomm ich auch sofort nach einem Neustart.


    Stört so ein Fehler das Programm?

  • ok, dann wird ich morgen mal einen test starten.


    Da hab ich noch eine Frage: Bleibt des Skript im Hintergrund aktiv wenn ich es mit bash ausführe und dann die Konsole schließe?


    Ich wird mir morgen noch ein paar Sinnvolle Stellen für logging überlegen...

  • Hab es mal im Hintergrund laufen lassen:


    Aus dem Log:


    1)


    Code
    if [ $( ping -c1 $i | grep "received" | awk -F ',' '{print $2}' | awk '{print $1}' ) -eq 0 ]; then



    Gibt folgende Fehlermeldung:



    Code
    /share/CACHEDEV1_DATA/Recordings/Test.sh: line 68: [: -eq: unary operator expected2016-09-08 20:24:02.166

    2)


    Code
    if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -ne 0 -a $shutdown_timer -eq 0 ]; then

    Gibt folgende Fehlermeldung:


    Code
    /share/CACHEDEV1_DATA/Recordings/Test.sh: line 75: [: too many arguments

    3)

    Code
    if [ $(who | wc -l) -ne 0 ]; then

    Gibt folgende Fehlermeldung:


    Code
    share/CACHEDEV1_DATA/Recordings/Test.sh: line 89: who: command not found

    4)


    Code
    if [ $(curl -s --user $tvh_login:$tvh_password http://127.0.0.1:9981/status.xml | grep "subscriptions" | awk -F '>' '{print $2}' | awk -F '<' '{print $1}') -eq 0 ];

    Gibt folgend Fehlermeldung


    Code
    share/CACHEDEV1_DATA/Recordings/Test.sh: line 93: [: -eq: unary operator expected

    Kann damit wer was anfangen?