Ausgabe von screen auf Konsole umleiten

  • Hallo zusammen,

    ich habe ein Problem bei dem ich nicht weiterkomme.
    Ich habe an meinem RaspberryPi3 über ein USB-to-serial Kabel meinen AV-Receiver verbunden.
    Nun erstelle ich in einem bash-Skript über "screen" eine Verbindung auf die serielle Konsole des AV-Receivers, um Befehle dorthin zu senden.
    Das funktioniert ($stuffstuff ist der Befehl, den ich sende):

    Code
    /usr/bin/screen -dmS AVR2807 /dev/avr2807 9600
    /usr/bin/screen -S AVR2807 -X stuff $stuffstuff
    /usr/bin/screen -S AVR2807 -X kill


    Nun würde ich allerdings gerne die Antwort meines AV-Receivers in meiner Konsole ausgeben, damit ich sie weiterverarbeiten kann.
    Da das irgendwie nicht einfach zu gehen scheint, habe ich den Umweg über ein logfike genommen, d.h. 'screen' mitloggen lassen, die logdatei dann auslesen und auf der Konsole ausgeben:

    Code
    echo "logfile avrcom.log" > avrcom.screenrc
    /usr/bin/screen -c avrcom.screenrc -dmLS AVR2807 /dev/avr2807 9600
    /usr/bin/screen -S AVR2807 -X stuff $stuffstuff
    rm avrcom.screenrc
    sed 's/\r/\n/g' avrcom.log
    rm avrcom.log


    Das Problem ist aber, dass die Datei offensichtlich nicht schnell genug beschrieben wird. Jedenfalls kam meist keine Ausgabe und oft wurde die Datei danach auch nicht gelöscht. Allerdings funktioniert es, wenn die avrcom.log schon vorher besteht, er gibt mir aber dann den alten Wert aus, der schon im logfile stand. Deshalb habe ich vor dem 'sed' eine Warteschleife eingebaut:

    Code
    for i in `seq 1 10`; do
             if [ -s avrcom.log ]; then
               #echo "Unterbrochen"
               break
             fi
             sleep 1
    done


    Hilft aber nix.

    Hat jemand einen Tip?! Danke!

    Apollon.


    P.S.: Hier das ganze Skript:

    Display Spoiler


    #! /bin/sh
    # /usr/bin/avrcom

    port=/dev/avr2807
    device="AVR2807"
    screenrc="/usr/bin/avrcom.screenrc"
    logfile="/usr/bin/avrcom.log"
    stuffstuff="$2\r"
    timeout=5

    #touch /var/lock/$device

    case "$1" in
    start)
    if [ "$2" = "log" ]; then
    echo "Starting serial connection to $device ..."
    echo "Logging to $logfile ..."
    echo "logfile $logfile" > $screenrc
    /usr/bin/screen -c $screenrc -dmLS $device $port 9600
    rm $screenrc
    else
    echo "Starting serial connection to $device ..."
    /usr/bin/screen -dmS $device $port 9600
    fi
    ;;
    stop)
    echo "Stopping serial connection to $device ..."
    /usr/bin/screen -S $device -X kill
    if [ "$2" = "keeplog" ]; then
    if [ -f $logfile ]; then
    echo "Keeping logfile $logfile ..."
    else
    echo "No logfile to keep ..."
    fi
    else
    if [ -f $logfile ]; then
    echo "Deleting Logfile $logfile ..."
    rm $logfile
    else
    echo "No logfile to delete ..."
    fi
    fi
    ;;
    restart)
    echo "Restarting serial connection to $device ..."
    /usr/bin/screen -S $device -X kill
    /usr/bin/screen -dmS $device $port 9600
    ;;
    send)
    if [ -n "$2" ]; then
    #echo "Sending $2..."
    /usr/bin/screen -S $device -X stuff $stuffstuff
    else
    echo "Usage: $0 $1 {command}"
    fi
    ;;
    cmd)
    if [ -n "$2" ]; then
    if [ "$3" = "log" ]; then
    echo "logfile $logfile" > $screenrc
    #sleep 1
    /usr/bin/screen -c $screenrc -dmLS $device $port 9600
    /usr/bin/screen -S $device -X stuff $stuffstuff
    rm $screenrc
    #sleep 1
    #echo "" > /dev/null
    for i in `seq 1 $timeout`; do
    if [ -s $logfile ]; then
    #echo "Unterbrochen"
    break
    fi
    sleep 1
    echo $i
    done
    sed 's/\r/\n/g' $logfile > /dev/stdout
    #echo $output
    #rm $screenrc
    #echo "" > /dev/null
    #sleep 1
    rm $logfile
    else
    /usr/bin/screen -dmS $device $port 9600
    /usr/bin/screen -S $device -X stuff $stuffstuff
    fi
    /usr/bin/screen -S $device -X kill
    else
    echo "Usage: $0 $1 {command} (log)"
    fi
    ;;
    killall)
    PID=`ps xa | grep $device | awk '{ print $1 }'`
    kill $PID 2>>/dev/null
    echo "Killed the following processes: $PID"
    if [ -f $logfile ]; then
    echo "$logfile deleted."
    rm $logfile
    fi
    if [ -f $screenrc ]; then
    echo "$screenrc deleted."
    rm $screenrc
    fi

    ;;
    *)
    echo "Usage: $0 {start (log) | stop (keeplog) | restart | send command | cmd command (log) | killall}"
    exit 1
    ;;
    esac
    exit 0

    Edited once, last by Apollon77 (August 6, 2016 at 5:09 PM).


  • Nachtrag: Warum löschst Du denn in "start" das Logfile direkt nach dem screen-Aufruf?

    mach ich nicht. gelöscht wird das screenrc-file.

    Meine Frage bezieht sich auf cmd) da ich dort die screen-session direkt öffne den Befehl sende und wieder schliesse. Bei start) wird der/die Befehl(e) gesondert über send) abgesetzt. Das logfile bei start) / stop) ist korrekt. Bei send) hab ich die logausgabe noch nicht implementiert.

    Sync muss ich mal probieren.

    Edited once, last by Apollon77 (August 6, 2016 at 5:42 PM).

  • Wieso willst du denn überhaupt screen verwenden? Ich versteh gerade nicht so recht den Grund dafür bzw missbrauchst du screen für eine Serielle Verbindung... Klar, unterstützt screen das auch, aber es wäre denk ich einfacher wenn du screen einfach nur öffnest und darin dann einen Befehl zum auslesen des seriellen Ports ausführst den du dann wiederum umleisten kannst... Wobei das über 3 Ecken irgendwie auch von hinten durch die Brust ins Auge is...


    PS: FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

  • ja ich hab keine andere sinnvolle Lösung gefunden.
    Im Endergebnis will ich einfach nur aus meiner Hausautomationsumgebung (Fhem), welche auf perl basiert, einen Befehl an meinen AV-Receiver senden und die Antwort vom AV-Receiver dann auslesen und weiterverarbeiten. Wenns dafür einfachere Lösungen gibt, als mein Skript, nehm ich die gern...
    Automatisch zusammengefügt:
    Oh Mann!!! Ihr habt recht. Viel zu umständlich. Aber manchmal hat man nen Knick im Hirn...
    Als ich das Script geschrieben hab, gab es kein Modul für meinen AV-Receiver in Fhem. Inzwischen gibt es eins. Geht alles automatisch und perfekt...

    Danke!

    Edited once, last by Apollon77 (August 6, 2016 at 10:24 PM).

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!