[gelöst] Cubietruck + FHEM + utf8

Begonnen von RoBra81, 04 April 2018, 14:33:18

Vorheriges Thema - Nächstes Thema

helmut

Zitat von: RoBra81 am 05 April 2018, 15:54:05
Mein Server startet im RunLevel 2 und da (in /etc/rc2.d/) [...]

Hallo Ronny,

das finde ich ungewoehnlich. Runlevel 2 startet Multi-User ohne Netz. Aber wie auch immer, wenn
Du "Required-Start: $all" im fhem-Skript stehen hast, sollte das auch in allen anderen Runleveln
zum Schluss gestartet werden wenn der update-rc.d druebergelaufen ist.

Die Arbeitshypothese von mumpitzstuff hat dennoch einen einen gewissen Charme. Versuch doch
mal Folgendes in der /etc/rc.local. Ich hoffe, das laeuft auf Deinem System so ohne Weiteres.


for n in 0 60; do
  for u in root fhem; do
    (sleep $n; logger $u $n sec: $(su -l - $u -c locale)) &
  done
done


Vielleicht bringen Dir die logger-Ausgaben in /var/log/syslog (suche nach "logger:") neue Erkenntnisse.
Die sleep-Zeiten kannst Du ja noch variieren.

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

RoBra81

Das einzige, was ich mit logger finde ist das:


Apr  7 18:18:47 homeserver kernel: [    3.128465] logger: created 256K log 'log_main'
Apr  7 18:18:47 homeserver kernel: [    3.136806] logger: created 256K log 'log_events'
Apr  7 18:18:47 homeserver kernel: [    3.145224] logger: created 256K log 'log_radio'
Apr  7 18:18:47 homeserver kernel: [    3.153632] logger: created 256K log 'log_system'


Gesendet von meinem SM-G935F mit Tapatalk



RoBra81

Es hat auch scheinbar nix mit der Verzögerung zu tun, da auch ein shutdown restart nicht hilft, sondern nur shutdown mit anschließendem manuellem Start über putty...

Gesendet von meinem SM-G935F mit Tapatalk


helmut

#18
Hallo Ronny,

beim "shutdown restart" bleibt das Environment des Prozesses (und damit auch die Spracheinstellungen) gleich.
Das gilt auch, wenn ein einfacher sleep vor den Aufruf von fhem beim Systemstart eingesetzt wird. Mit dem "su -l"
beim Start von fhem wird das Environment erneuert. In Kombination mit dem sleep passiert das deutlich nach dem
Systemstart.

Schade, dass der Test in der rc.local nicht funktioniert hat. Wenn Du magst, kannst Du versuchen das "-e" am Ende
des shebang zu entfernen und die Datei von Hand aufzurufen. Dann siehst Du, warum die Schleife nicht ausgefuehrt
wird.

Du kannst auch gleich versuchen, das "su" anstelle von "perl fhem.pl fhem.cfg" in das fhem-Startskript einzubauen:

(sleep 120; su -l root -c "set -e; cd /opt/fhem; port=7072; perl fhem.pl fhem.cfg") &

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

RoBra81

Zitat von: helmut am 08 April 2018, 13:52:26
Wenn Du magst, kannst Du versuchen das "-e" am Ende
des shebang zu entfernen und die Datei von Hand aufzurufen. Dann siehst Du, warum die Schleife nicht ausgefuehrt
wird.

Meine rc.local sieht jetzt so aus:

#!/bin/sh
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo 2 > /proc/irq/$(cat /proc/interrupts | grep eth0 | cut -f 1 -d ":" | tr -d " ")/smp_affinity
KILLPROC=$(ps uax | pgrep fbi | tail -1); if [ -n "$KILLPROC" ]; then kill $KILLPROC; fi

for n in 0 60; do
  for u in root fhem; do
     (sleep $n; logger $u $n sec: $(su -l - $u -c locale)) &
   done
done

exit 0


und ich erhalte diese Fehlermeldung:

/etc/rc.local: 18: /etc/rc.local: Syntax error: "do" unexpected (expecting "done")


Ronny

helmut

Hallo Ronny,

welche Shell verwendet Dein System fuer /bin/sh? Die ermittelst Du mit "echo $0". In meinem Raspbian ist das
ein Link auf /bin/bash. Und die kann mit verschachtelten for/do-Konstrukten umgehen. Kannst Du Deine Shell
mit zusaetzlichen Klammern austricksen?
for n in 0 60; do
   (for u in root fhem; do
      (sleep $n; logger $u $n sec: $(su -l - $u -c locale)) &
   done)
done


An Zeilentrennern kann es nicht liegen, denn das funktioniert in der bash auch:
for n in 0 60; do for u in root fhem; do (sleep $n; logger $u $n sec: $(su -l - $u -c locale)) & done done

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

RoBra81

So, nun habe ich es so in der rc.local:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

echo 2 > /proc/irq/$(cat /proc/interrupts | grep eth0 | cut -f 1 -d ":" | tr -d " ")/smp_affinity
KILLPROC=$(ps uax | pgrep fbi | tail -1); if [ -n "$KILLPROC" ]; then kill $KILLPROC; fi

for n in 0 60; do
   (for u in root fhem; do
      (sleep $n; logger $u $n sec: $(su -l - $u -c locale)) &
   done)
done

exit 0


und das Ergebnis beim Reboot (nachdem ich dem user fhem die bash freigegeben habe) im syslog:

Apr 12 08:53:52 homeserver root: root 0 sec: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=
Apr 12 08:53:52 homeserver root: fhem 0 sec: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=
Apr 12 08:54:52 homeserver root: root 60 sec: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=
Apr 12 08:54:52 homeserver root: fhem 60 sec: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=


Wenn nicht das richtig interpretiere hat der user fhem die locales korrekt gesetzt?!

Daher habe ich nochmal weiter probiert und nun wird's komisch:

Ich habe mal mein fhem-Startscript in /etc/init.d/ angepasst und die Zeile

logger localesFhem at $1: $(su -l - fhem -c locale)

vor dem Start von fhem ergänzt. Nun steht nach einem Neustart des Servers folgende Zeile im Syslog:

Apr 12 09:13:08 homeserver root: localesFhem at start: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=


Die locales sind also scheinbar auch hier schon gesetzt, im FHEM sind sie es jedoch nicht?!

helmut

Hallo Ronny,

das ist in der Tat richtig komisch. Als letzten Versuch haette ich noch anzubieten, den Benutzer "fhem" in
"logger localesFhem at $1: $(su -l - fhem -c locale)" im "fhem-Startscript durch "root" zu ersetzen. Ich
halte es zwar nicht fuer wahrscheinlich, dass root zu diesem Zeitpunkt ein anderes Environment hat
(welches fhem mit setuid erbt), aber der Teufel ist ja bekanntlich ein Eichhoernchen  ;)

Wenn auch dabei nichts herauskommt, gehen mir langsam die Ideen aus.

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

helmut

Hallo Ronny,

das war eben ueberhaupt nicht zu Ende gedacht. Eigentlich ist doch zumindest fuer den Benutzer "fhem" zum
Zeitpunkt der Ausfuehrung des Startskriptes schon alles in Ordnung. Mein Vorschlag war ja
(sleep 120; su -l root -c "set -e; cd /opt/fhem; port=7072; perl fhem.pl fhem.cfg") &
aber wenn dem so ist, kannst Du sogar das sleep weglassen
su -l fhem -c "set -e; cd /opt/fhem; port=7072; perl fhem.pl fhem.cfg"

Unter rein akademischen Gesichtspunkten kannst Du auch ein
logger localesFhem at $1: $(locale)
in das Startskript einbauen um zu verifizieren, dass die locales fuer root zu diesem Zeitpunkt falsch sind.

Gruss Helmut
Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

RoBra81

Zitat von: helmut am 12 April 2018, 14:27:33
aber wenn dem so ist, kannst Du sogar das sleep weglassen
su -l fhem -c "set -e; cd /opt/fhem; port=7072; perl fhem.pl fhem.cfg"

Das habe ich jetzt mal probiert und siehe da, nach dem Start hat FHEM die korrekten locales  ;D

Zitat von: helmut am 12 April 2018, 14:27:33
Unter rein akademischen Gesichtspunkten kannst Du auch ein
logger localesFhem at $1: $(locale)
in das Startskript einbauen um zu verifizieren, dass die locales fuer root zu diesem Zeitpunkt falsch sind.

Auch das habe ich aus Interesse mal gemacht und habe feststellen müssen, dass root nicht nur zu diesem Zeitpunkt an der Stelle die falschen locales hat, sondern auch noch nach x Tagen Laufzeit, was man beim Stop des Servers sieht:

Apr 13 11:14:55 homeserver root: localesFhem at stop: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=
Apr 13 11:14:55 homeserver root: localesFhem ohne su at stop: LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL=
Apr 13 11:17:29 homeserver root: localesFhem at start: LANG=de_DE.UTF-8 LANGUAGE=de_DE.UTF-8 LC_CTYPE="de_DE.UTF-8" LC_NUMERIC="de_DE.UTF-8" LC_TIME="de_DE.UTF-8" LC_COLLATE="de_DE.UTF-8" LC_MONETARY="de_DE.UTF-8" LC_MESSAGES=POSIX LC_PAPER="de_DE.UTF-8" LC_NAME="de_DE.UTF-8" LC_ADDRESS="de_DE.UTF-8" LC_TELEPHONE="de_DE.UTF-8" LC_MEASUREMENT="de_DE.UTF-8" LC_IDENTIFICATION="de_DE.UTF-8" LC_ALL=
Apr 13 11:17:29 homeserver root: localesFhem ohne su at start: LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL=


Da ich für diese Lösung die bash für den User fhem aktivieren musste, ist das sicherlich nicht die optimale Lösung, aber zumindest funktioniert es jetzt erstmal...

Vielen Dank

Ronny

helmut

Zitat von: RoBra81 am 13 April 2018, 11:24:33
Auch das habe ich aus Interesse mal gemacht und habe feststellen müssen, dass root nicht nur zu diesem Zeitpunkt an der Stelle die falschen locales hat, sondern auch noch nach x Tagen Laufzeit, was man beim Stop des Servers sieht:
Hallo Ronny,

das muss an der Debian-Implementierung fuer den Cubietruck liegen. Das ist fuer mich unter anderem ein
Grund auf leistungsfaehigere und ebenfalls stromsparende Alternativen zum RP zu verzichten.

Zitat von: RoBra81 am 13 April 2018, 11:24:33
Da ich für diese Lösung die bash für den User fhem aktivieren musste, ist das sicherlich nicht die optimale Lösung,
Die bash ist doch nichts Schlechtes und aus gutem Grund Voreinstellung bei vielen Linux-Systemen.

Zitat von: RoBra81 am 13 April 2018, 11:24:33
aber zumindest funktioniert es jetzt erstmal...
Das ist doch die Hauptsache. Schreibst Du bitte noch ein "[Gelöst]" vor den Betreff Deines ersten Beitrages? Danke.

Gruss Helmut

Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)

RoBra81

Zitat von: helmut am 13 April 2018, 12:37:23
Die bash ist doch nichts Schlechtes und aus gutem Grund Voreinstellung bei vielen Linux-Systemen.
Die bash ist nichts schlechtes und wird auch bei mir eingesetzt, aber ich meine, in diversen Foreneinträgen/Anleitungen gelesen zu haben, dass der user fhem sich gar nicht anmelden können sollte (false statt bash in passwd). Aber egal, Hauptsache, es funktioniert.

Zitat von: helmut am 13 April 2018, 12:37:23
Das ist doch die Hauptsache. Schreibst Du bitte noch ein "[Gelöst]" vor den Betreff Deines ersten Beitrages? Danke.

Mache ich sofort, nochmal danke.

Ronny

helmut

Zitat von: RoBra81 am 13 April 2018, 14:22:54
Die bash ist nichts schlechtes und wird auch bei mir eingesetzt, aber ich meine, in diversen Foreneinträgen/Anleitungen gelesen zu haben, dass der user fhem sich gar nicht anmelden können sollte (false statt bash in passwd). Aber egal, Hauptsache, es funktioniert.
Ronny

Hallo Ronny,

da gibt es durchaus kontroverse Meinungen
https://forum.fhem.de/index.php/topic,36120.msg313007.html#msg313007
und es scheint Module zu geben, die sogar eine bash voraussetzen wie zum Beispiel 57_GCALVIEW
https://forum.fhem.de/index.php/topic,77502.msg694178.html#msg694178

Also mach Dir deswegen keine Gedanken.

Gruss Helmut

Intelligenz ist die Fähigkeit, Arbeit zu vermeiden, aber dafür zu sorgen, daß die Arbeit gemacht wird.
(Linus Torvalds)