Author Topic: Fehlermeldung auf dem Red Brick: Could not find file "/etc/localtime"  (Read 3588 times)

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Hallo,
ich habe ein Programm auf C# geschrieben, bei dem unter anderem die Zeit- und Datumsangabe des Red Bricks ausgegeben werden sollte (z.B.: DateTime.Now.Second). Bekomme dabei aber jedesmal, wenn ich es auf dem Red Brick laufen lasse die Fehlermeldung:
"Unhandled Exception:
System.IO.FileNotFoundException: Could not find file "/etc/localtime"
File name: '/etc/localtime'"

Beim Debuggen des Programms über Visual Studio funktioniert es hingegen einwandfrei, hierbei wird wahrscheinlich einfach die Computer-Zeitangabe verwendet.
Wäre hierbei sehr dankbar für Hilfe.
Meine zweite Frage wäre, wie ein Befehl aussieht die Red Brick Zeit über einen Programmtext individuell abzuändern. Also beispielsweise irgendein Datum mit beliebeiger Zeit vorzugeben.
Vielen herzlichen Dank.

rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Moin,
das ist vermutlich auf einen Bug im Brick Viewer zurückzuführen, der mit Version 2.4.5 gefixt wurde.

/etc/localtime ist ein Symlink auf die gewünschte Zeitzone in /usr/share/zoneinfo/. Vor Version 2.4.5 hat der Brick Viewer aber localtime auf nicht vorhandene Dateien gelinkt, C# gibt dann die FileNotFoundException aus.

Wenn du mit dem aktuellen Brick Viewer die Zeitzone des RED-Brick neu setzt, sollte das Problem behoben sein.

Um die Zeit des RED-Bricks zu setzen kannst du
Code: [Select]
date auf der Kommandozeile oder mit System.Diagnostics.Process verwenden. Zum Beispiel mit
Code: [Select]
date +%s -u -s @1565681174 (als Unix-Timestamp, so macht es der Brick Viewer) oder mit
Code: [Select]
date -s "13 AUG 2019 09:25:30"
« Last Edit: August 13, 2019, 09:37:50 by rtrbt »

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Vielen Dank für die Hilfe👌
Das Programm läuft jetzt auf dem Red Brick.

Mir ist leider noch nicht ganz genau klar, wie ich die Zeit auf dem Red Brick manuell manipulieren kann. Muss ich dazu using System.Diagnostics bzw. Using System.Diagnostics.Process einbinden? Denn wenn ich im Programm-Code alleine date verwenden möchte, kennt das Programm den Befehl nicht. Mein Ziel wäre es nämlich die Red Brick Zeit anhand von integer Variablen zu setzen.

Zum Beispiel:
int stunde = 12;
int minute = 5;
int sekunde = 12;
Diese Daten dann neu als Red Brick Zeit setzen.
Vielen Dank.😊

rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Process kannst du verwenden, wie hier beschrieben. In deinem Fall müsste
Code: [Select]
myProcess.StartInfo.FileName = "C:\\HelloWorld.exe";stattdessen
Code: [Select]
myProcess.StartInfo.FileName = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stunde, minute, sekunde); (o.Ä.) sein.

rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Was gerade noch aufgefallen ist: Datum/Zeit zu setzen geht nur mit Root-Rechten. Du kannst aber dem Standarduser (also tf) erlauben, das ohne Root-Passwort zu tun, in dem du auf der seriellen Konsole des RED-Brick einmalig folgenden Befehl ausführst:
Code: [Select]
echo 'tf ALL=(root) NOPASSWD: /bin/date' | sudo tee -a /etc/sudoersWenn du dann in deinem Programm
Code: [Select]
/bin/date durch
Code: [Select]
/usr/bin/sudo /bin/date ersetzt, sollte es klappen.

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Danke für die Infos.
Hab jetzt einmalig den Befehl:
echo 'tf ALL=(root) NOPASSWD: /bin/date' | sudo tee -a /etc/sudoers

auf der Red Brick Serial Consol ausgeführt.

Zusätzlich habe ich in meinem Code folgende Zeilen geschrieben:

using (Process myProcess = new Process())
{
   //myProcess.StartInfo.UseShellExecute = false;
   myProcess.StartInfo.FileName = String.Format("/usr/bin/sudo /bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund);
   //myProcess.StartInfo.CreateNoWindow = true;
   myProcess.Start();
}

Die auskommentierten Zeilen brauch ich ja nicht oder?
Bei diesem Programm kommt jedenfalls immer ein Fehler beim Aufrufen von myProcess.Start();
Wenn ich diesen Befehl weglasse, wird zwar das Programm ausgeführt jedoch wird die Zeit nicht verändert. (Die Bibliotheken using System;
using System.Diagnostics; using System.ComponentModel; habe ich oben in mein Programm eingebunden)

Macht ja nichts, dass ich diesen Programmtext erst mitten in meinem Code geschrieben habe oder?
Vielen Dank für weitere Hilfe :) :)


rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Was für eine Fehlermeldung bekommst du, wenn du myProcess.Start(); aufrufst?

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Der nachfolgende Fehler tritt dann auf wenn die myProcess.Start() aufgerufen wird.

rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Ah, manchmal ist man einfach betriebsblind, sorry dafür. Das Problem ist, dass StartInfo den Namen der ausführbaren Datei und die Argumente getrennt will, da ja auch keine Shell benutzt wird (deshalb optionalerweise UseShellExecute = false). So funktioniert es bei mir:
Code: [Select]
using (Process myProcess = new Process())
{
    myProcess.StartInfo.FileName = "/usr/bin/sudo";
    myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund);
    myProcess.Start();
}

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Ja jetzt läufts, vielen herzlichen Dank :)
Falls ich den Tag, Monat und Jahr ebenfalls noch als integer Variable zu Anpassung der Red Brick Zeit verwenden würde, wie würde sich da die Zeile:

myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"22 AUG 2019 {0:00}:{1:00}:{2:00}\"", stund, minut, sekund);


noch ändern?

Chris200

  • Newbie
  • *
  • Posts: 6
    • View Profile
Re: Fehlermeldung auf dem Red Brick: Could not find file "/etc/localtime"
« Reply #10 on: September 01, 2019, 18:36:12 »
Hallo, könnte mir bitte jemand noch bei der Anpassung der Zeit mit der Berücksichtigung der Jahreszahl, Monatsangabe und Anzahl des Tages als integer Variabel helfen. Ich weiß nicht genau wie ich die Zeile myProcess.StartInfo.Arguments dementsprechend abändern muss, dass ich diese drei Variablen auch vorgeben kann.
Vielen herzlichen Dank im Voraus😊👍

rtrbt

  • Tinkerforge Staff
  • Administrator
  • Full Member
  • *****
  • Posts: 112
    • View Profile
Re: Fehlermeldung auf dem Red Brick: Could not find file "/etc/localtime"
« Reply #11 on: September 02, 2019, 11:07:31 »
Dafür musst du die Teile in dem Datumsstring auch durch Platzhalter ersetzen, die du dann mit String.Format einsetzt, z.B so:
Code: [Select]
myProcess.StartInfo.Arguments = String.Format("/bin/date -s \"{0:00} {1} {2:0000} {3:00}:{4:00}:{5:00}\"", jahr, monat, tag, stunde, minute, sekunde);Den Monat musst du als String reingeben, also z.b. AUG oder SEP. Alternativ kannst du dir mal die anderen Formate ansehen, die date versteht, die sind z.B. hier dokumentiert.