Vielleicht wärs einfacher die Anforderungen des Programms in ... C / C++ umzusetzen und somit auf dieses, meines Erachtens ohnehin, dämliche .NET gedöns zu verzichten?
hatte ich auch schon vorgeschlagen und den Weg gezeigt, aber .....
Vielleicht wärs einfacher die Anforderungen des Programms in ... C / C++ umzusetzen und somit auf dieses, meines Erachtens ohnehin, dämliche .NET gedöns zu verzichten?
hatte ich auch schon vorgeschlagen und den Weg gezeigt, aber .....
C# Programm beim Booten starten? Schau mal ob du hier fündig wirst!
Hi Dreamshader,
Hi Andreas,
ja ... das dachte ich mir schon, dass ihr da schon darauf hingewiesen hattet - ihr macht das schliesslich auch nicht erst seit gestern ...
Aber vielleicht ging's ein bisschen zu sehr drunter und drüber und unser TE, der ja, wie er selbst sagt, ziemlich unbeleckt ist, hat einfach die Übersicht verloren.
Ich sag' mir halt: jeder hat eine zweite Chance verdient und wenn man mal ehrlich ist: er gibt sich ja Mühe (da hatten wir schon andere Kandidaten ) ... ist ja alles nicht so einfach am Anfang ...
Das stimmt alles, er gibt sich echt Mühe, uns zu verstehen...
baumus: Als ich 2012 mit dem Raspberry angefangen habe, habe ich mir die Ausgaben des Online-Magazins TheMagPi heruntergeladen und durchgelesen. Heute gibt es davon 43 Ausgaben zzgl. etlicher Sonderausgaben. Für Dich wäre wahrscheinlich die Ausgabe "Conquer the Command Line" das Richtige. Ich gebe mal mit Absicht keinen Link. Das Teil lässt sich auf der Homepage der Foundation finden. Auf der Hauptseite ist ganz unten ein Link auf TheMagPi... Und dann fröhliches Downloaden, Lesen, Aha-Effekte, Nachmachen, noch mehr Aha-Effekte und neue Ideen.
Und einen habe ich noch: Wie wäre es, wenn Du statt Deines C#-Exe-Teils einfach ein Programm wie cuteCom laufen lässt? Das zeigt Dir alles an, was von der seriellen Schnittstelle kommt.
(wenn ich mich nicht irre)
Beste Grüße
Andreas
Das stimmt alles, er gibt sich echt Mühe, uns zu verstehen...
baumus: Als ich 2012 mit dem Raspberry angefangen habe
Andreas
als ich 2013 angefangen hatte und mich für C Programme am PI interessierte half mir das hier:
vergiss mono und Krücken und schon gar EXE
http://kampis-elektroecke.de/?page_id=1544
voila, die ersten Programme liefen nach einem Abend.
Hi Jar,
voila, die ersten Programme liefen nach einem Abend.
[OT]
ich hatte als erstes Lazarus installiert - das Laufzeit-Verhalten des Compilers war (damals) grauenvoll. Dann hatte ich mich an Icon erinnert. Und - hui - das lief richtig flott!
[/OT]
Beste Grüße
Andreas
Danke erstmal, dass sich so viele um dieses Thema bemühen! Ich werde versuchen alles so gut es geht zu beantworten.
Also ... dann würde ich vorschlagen erst mal den absoluten Pfad von mono mit "which mono" zu ermitteln
Habe es jetzt auf
geändert. Jetzt starten allerdings im Hintergrund nicht mehr mono - habe das mit "top" überprüft" --> siehe EDIT am Ende.
lernwillig ... lehr willig wäre etwas anderes
Stimmt
Was passiert, wenn Du jetzt /etc/rc.local direkt aufrufst?
Habe das mit "sudo su" (also sollte ich doch alle Rechte haben, oder?) ausgeführt, und bekomme folgendes zurück: --> siehe EDIT
Automatisch zusammengefügt:
Was genau macht denn dein C# Programm?
Ich kann hier gerne de Quellcode von dem Programm schicken, allerdings weiß ich jetzt nicht so genau, ob das wirklich erwünscht ist.
Es öffnet einen Port und sendet dann regelmäßig einen bestimmten Befehl an eine Interfacecard eines Wechselrichters einer PV-Anlage. Dieses Interfacecard antwortet, und diese Antwort muss dann interpretiert werden und in eine Textdatei gespeichert werden.
Automatisch zusammengefügt:
baumus: Als ich 2012 mit dem Raspberry angefangen habe, habe ich mir die Ausgaben des Online-Magazins TheMagPi heruntergeladen und durchgelesen. Heute gibt es davon 43 Ausgaben zzgl. etlicher Sonderausgaben. Für Dich wäre wahrscheinlich die Ausgabe "Conquer the Command Line" das Richtige. Ich gebe mal mit Absicht keinen Link. Das Teil lässt sich auf der Homepage der Foundation finden. Auf der Hauptseite ist ganz unten ein Link auf TheMagPi... Und dann fröhliches Downloaden, Lesen, Aha-Effekte, Nachmachen, noch mehr Aha-Effekte und neue Ideen.Und einen habe ich noch: Wie wäre es, wenn Du statt Deines C#-Exe-Teils einfach ein Programm wie cuteCom laufen lässt? Das zeigt Dir alles an, was von der seriellen Schnittstelle kommt.
Ich bin wirklich gerne bereit das alles zu lernen, den langsam werden mir doch auch die Vorteile von Linux und dem Raspberry Pi bewusst^^
Allerdings habe ich das Problem, dass ich bei diesem Projekt unter einem ziemlichen Zeitdruck stehe und dieses Programm dringend zum Laufen bringen müsste...
Automatisch zusammengefügt:
EDIT:
Habe wohl zw. bin/mono ein Leerzeichen gehabt - habe das entfernt und jetzt passiert genau das selbe wie bisher: es startet mono im Hintergrund (durch "top" bestätigt) allerdings wird das Programm an sich nicht ausgeführt.
Was passiert, wenn Du jetzt /etc/rc.local direkt aufrufst?
Das Programm wird fehlerfrei ausgeführt.
Hallo Baumus,
Ich kann hier gerne de Quellcode von dem Programm schicken, allerdings weiß ich jetzt nicht so genau, ob das wirklich erwünscht ist.
Mach' das doch mal! Die meisten von uns können besser Software als raten. Wenn Du das C#-Programm selber geschrieben hast, dann dürftest Du gegen keine Urheberrechte verstoßen. Wenn Du das Programm von irgendwoher hast (und ggf. verändert hast), dann gib' wenigstens die Quelle an. Und wenn es eine Software ist, die Du z.B. von dem Hersteller der Photovoltaik-Anlage hast, dann sollte der zumindest mal gefragt werden, ob er mit einer Veröffentlichung hier einverstanden ist.
Habe wohl zw. bin/mono ein Leerzeichen gehabt - habe das entfernt und jetzt passiert genau das selbe wie bisher: es startet mono im Hintergrund (durch "top" bestätigt) allerdings wird das Programm an sich nicht ausgeführt.
Das Programm wird fehlerfrei ausgeführt.
Dann kann es nur daran liegen, dass [font="Courier New"]/etc/rc.local[/font] aufgerufen wird, bevor ALLE erforderlichen Ressourcen eingebunden sind. Denn wenn Du [font="Courier New"]/etc/rc.local[/font] manuell aufrufen kannst, dann sind logischerweise alle Ressourcen vorhanden. Daraus bleibt zu schlussfolgern, dass [font="Courier New"]mono dingsbums[/font] erst aufgerufen werden kann, nachdem ALLE Ressourcen gestartet wurden. Somit kommt dann allen Anscheins nach ein Autostart über [font="Courier New"]/etc/rc.local[/font] nicht in Frage...
:s
Vorschlag meinerseits: Einen Autostart einsetzen, der X gestartet hat, denn dann sind garantiert ALLE Ressourcen vorhanden. Auch das war bereits Ergebnis der ersten 7 Beiträge dieses Posts.
Baumus, gehe doch noch mal in die FAQ mit den Autostarts und schaue Dir mal an, welche der - soweit ich mich entsinnen kann - beiden Möglichkeiten beschrieben sind, Programme, die X erfordern, per Autostart aufzurufen. Setze das mal so um, wie es dort beschrieben steht und teile uns hier mit:
a) was Du gemacht hast
b) was das jeweilige Ergebnis ist
Beste Grüße und gutes Gelingen!
Andreas
Hm ...
... im Hintergrund (durch "top" bestätigt) allerdings wird das Programm an sich nicht ausgeführt.
ist das jetzt das Verhalten nach einem reboot?
Das Programm wird fehlerfrei ausgeführt.
ok ... also beim direkten Aufruf tut's also, was es tun soll.
Tjaaa ... vielleich machen wir mal einen service draus - wäre eh besser.
Was ist Dein bevorzugter Editor auf dem RPi bzw. mit welchem kannst Du einigermassen umgehen?
cu,
-ds-
Mach' das doch mal!
Habe alles selber geschrieben also verstoße ich keine Urheberrechte. Hier der C#-Quellcode:
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;
using System.Net;
namespace Einlesen_2
{
class Program
{
//static byte DEVICE_1 = 0x00;
static byte WECHSELRICHTER = 0x01;
static byte SENSOR_CARD = 0x02;
static byte NR_1 = 01;
static byte NR_2 = 02;
const int POWER_NOW = 0x10;
const int ENERGY_TOTAL = 0x11;
const int I_AC = 0x14;
const int I_DC = 0x17;
const int U_DC = 0x18;
const int irradiance_NOW = 0xe2;
const int temperature_channel_1 = 0xe0;
static byte[] powernow;
static byte[] energytotal;
static byte[] iac;
static byte[] idc;
static byte[] udc;
static byte[] irradiancenow;
static byte[] temp_ch_1;
static byte[] NR = { NR_1, NR_2 };
const string filename = "AusgeleseneDaten.dat";
static bool debugoutput = false;
static void Main(string[] args)
{
/*var s = SerialPort.GetPortNames();
Console.WriteLine(s.Length);
foreach (var sx in s)
Console.WriteLine(sx); */
Thread t = new Thread(new ThreadStart(ReadData));
t.IsBackground = true;
t.Start();
Console.WriteLine("Press any key to exit\n");
while (!Console.KeyAvailable) ;
}
static void ReadData()
{
string[] ports = SerialPort.GetPortNames();
SerialPort port = new SerialPort();
port.BaudRate = 9600;
List<byte> list = new List<byte>();
FileStream fs = new FileStream(filename, FileMode.Append);
StreamWriter sw = new StreamWriter(fs);
sw.Close();
fs.Close();
fs.Dispose();
while (true)
{
try
{
ports = SerialPort.GetPortNames();
foreach (var s in ports)
{
try {
port.PortName = s;
port.Open();
if (port.IsOpen) break;
}
catch
{
}
}
if (!port.IsOpen) { Console.WriteLine("No Port!"); Thread.Sleep(2500); continue; }
else Console.WriteLine("Connected to " + port.PortName);
while (true)
{
DateTime start = DateTime.Now;
Console.WriteLine();
Console.WriteLine($"[{start}] Connected");
Console.WriteLine();
for (int i = 0; i < 2; i++)
{
fs = new FileStream(filename, FileMode.Append);
sw = new StreamWriter(fs);
sw.WriteLine();
sw.WriteLine(DateTime.Now.ToString());
byte[] sendBuffer = sendCommand(WECHSELRICHTER, NR[i], POWER_NOW, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("POWER_NOW CMD {0} send", i + 1);
var StartTime = DateTime.Now.Millisecond;
while (port.BytesToRead == 0)
{
{
if (DateTime.Now.Millisecond > StartTime + 1000)
{
Console.WriteLine("WARNING: POWER_NOW {0} not received", i + 1);
break;
}
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
powernow = getData(list);
if (powernow.Length > 0)
{
double exp = Math.Pow(10, (sbyte)powernow[2]);
double value = powernow[0] << 8;
value += powernow[1];
value *= exp;
sw.WriteLine($"POWER_NOW[{NR[i]}] = {value}W");
list.Clear();
}
}
Thread.Sleep(5000);
sendBuffer = sendCommand(WECHSELRICHTER, NR[i], ENERGY_TOTAL, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("ENERGY_TOTAL CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
if (DateTime.Now.Millisecond > StartTime + 1000)
{
Console.WriteLine("WARNING: ENERGY_TOTAL {0} not received", i + 1);
break;
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
energytotal = getData(list);
if (energytotal.Length > 0)
{
double exp = Math.Pow(10, energytotal[2]);
double value = energytotal[0] << 8;
value += energytotal[1];
value *= exp;
sw.WriteLine($"ENERGY_TOTAL[{NR[i]}] = {value}W");
list.Clear();
}
}
Thread.Sleep(5000);
sendBuffer = sendCommand(WECHSELRICHTER, NR[i], I_AC, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("I_AC CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
{
if (DateTime.Now.Millisecond > StartTime + 1000)
{
Console.WriteLine("WARNING: I_AC {0} not received", i + 1);
break;
}
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
iac = getData(list);
if (iac.Length > 0)
{
double exp;
if (iac[2] == 0 || iac[2] == 1 || iac[2] == 2 || iac[2] == 3 || iac[2] == 4 || iac[2] == 5 || iac[2] == 6 || iac[2] == 7 || iac[2] == 8 || iac[2] == 9 || iac[2] == 0xA0)
{ exp = Math.Pow(10, iac[2]); }
else if (iac[2] == 0xFF)
{ exp = Math.Pow(10, -1); }
else if (iac[2] == 0xFE)
{ exp = Math.Pow(10, -2); }
else if (iac[2] == 0xFF)
{ exp = Math.Pow(10, -3); }
else exp = 1;
double value = iac[0] << 8;
value += iac[1];
value *= exp;
value /= 100;
sw.WriteLine($"I_AC[{NR[i]}] = {value}A");
list.Clear();
}
}
Thread.Sleep(5000);
sendBuffer = sendCommand(WECHSELRICHTER, NR[i], I_DC, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("I_DC CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
{
if (DateTime.Now.Millisecond > StartTime + 1000)
{
Console.WriteLine("WARNING: I_DC {0} not received", i + 1);
break;
}
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
idc = getData(list);
if (idc.Length > 0)
{
double exp = Math.Pow(10, idc[2]);
double value = idc[0] << 8;
value += idc[1];
value *= exp;
value /= 100;
sw.WriteLine($"I_DC[{NR[i]}] = {value}A");
list.Clear();
}
}
Thread.Sleep(5000);
sendBuffer = sendCommand(WECHSELRICHTER, NR[i], U_DC, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("U_DC CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
{
if (DateTime.Now.Millisecond > StartTime + 1000)
{
Console.WriteLine("WARNING: U_DC {0} not received", i + 1);
break;
}
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
udc = getData(list);
if (udc.Length > 0)
{
double exp = Math.Pow(10, udc[2]);
double value = udc[0] << 8;
value += udc[1];
value *= exp;
sw.WriteLine($"U_DC[{NR[i]}] = {value}V");
list.Clear();
}
}
Thread.Sleep(5000);
/*
sendBuffer = sendCommand(SENSOR_CARD, NR[i], irradiance_NOW, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("irradiance_NOW CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
if (DateTime.Now.Millisecond > StartTime + 10)
{
Console.WriteLine("WARNING: irradiance_NOW {0} not received", i + 1);
break; }
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
irradiancenow = getData(list);
if (irradiancenow.Length > 0)
{
double exp = Math.Pow(10, irradiancenow[2]);
double value = irradiancenow[0] << 8;
value += irradiancenow[1];
value *= exp;
sw.WriteLine($"irradiance_NOW[{NR[i]}] = {value}W/m²");
list.Clear();
}
}
Thread.Sleep(5000);
sendBuffer = sendCommand(SENSOR_CARD, NR[i], temperature_channel_1, new byte[0]);
port.Write(sendBuffer, 0, sendBuffer.Length);
Console.WriteLine("Temperature CMD {0} send", i + 1);
while (port.BytesToRead == 0)
{
{
if (DateTime.Now.Millisecond > StartTime + 10)
{
Console.WriteLine("WARNING: Temperature {0} not received", i + 1);
break;
}
}
}
Thread.Sleep(10);
while (port.BytesToRead > 0)
{
list.Add((byte)port.ReadByte());
if (debugoutput)
{
sw.Write(list[list.Count - 1]);
sw.Write("-");
}
temp_ch_1 = getData(list);
if (temp_ch_1.Length > 0)
{
double exp = Math.Pow(10, temp_ch_1[2]);
double value = temp_ch_1[0] << 8;
value += temp_ch_1[1];
value *= exp;
sw.WriteLine($"Temperature[{NR[i]}] = {value}Grad C");
list.Clear();
}
}
Thread.Sleep(5000);
*/
if (i==1)
{
Console.WriteLine();
Console.WriteLine($"[{start}]All Data CMDs sent");
}
sw.Flush();
sw.Close();
fs.Close();
fs.Dispose();
}
Thread.Sleep(5000);
//Thread.Sleep((15 - (DateTime.Now - start).Minutes) * 60000);
//while ((DateTime.Now - start).TotalMinutes < 15);
}
}
catch
{
sw.Close();
fs.Close();
fs.Dispose();
DateTime start = DateTime.Now;
Console.WriteLine();
Console.WriteLine($"[{start}] Fehler: Port konnte nicht geöffnet werden");
Thread.Sleep((15 - (DateTime.Now - start).Minutes) * 500);
}
}
}
static byte[] getData(List<byte> list)
{
if (list.Count > 3)
{
if (list[0] == list[1] && list[1] == list[2] && list[2] == 0x80)
{
}
else list.RemoveRange(0, 3);
if (list.Count > 4)
{
byte length = list[3];
if (list.Count >= 8 + length)
{//all data complete
//list[4] == device
//list[5] == nr
//list[6] == cmd
byte[] data = new byte[length];
for (int i = 7; i < list.Count - 2; i++)
data[i - 7] = list[i];
return data;
//list[7] - list[list.count-2] -> data
//list[list.count-1] = check
}
}
}
return new byte[0];
}
static byte[] sendCommand(byte device, byte nr, byte cmd, byte[] data)
{
byte[] sendBuffer = new byte[8 + data.Length];
byte check = 0;
sendBuffer[0] = 0x80;
sendBuffer[1] = 0x80;
sendBuffer[2] = 0x80;
sendBuffer[3] = (byte)data.Length;
sendBuffer[4] = device;
sendBuffer[5] = nr;
sendBuffer[6] = cmd;
data.CopyTo(sendBuffer, 7);
for (int i = 3; i < sendBuffer.Length - 1; i++)
check += sendBuffer[i];
sendBuffer[sendBuffer.Length - 1] = check;
return sendBuffer;
}
}
}
Alles anzeigen
Vorschlag meinerseits: Einen Autostart einsetzen, der X gestartet hat, denn dann sind garantiert ALLE Ressourcen vorhanden. Auch das war bereits Ergebnis der ersten 7 Beiträge dieses Posts.
Werde es noch mal probieren - danke erst mal für die viele Unterstützung bisher!
Automatisch zusammengefügt:
ist das jetzt das Verhalten nach einem reboot?
Jo...
Was ist Dein bevorzugter Editor auf dem RPi bzw. mit welchem kannst Du einigermassen umgehen?
Ich habe auf dem RPi selber noch nie etwas programmiert - habe also absolut keine Erfahrungswerte...
Moin baumus,
es geht dabei nicht um Programmieren sondern darum, eine Datei zu verändern.
nano oder was benutz Du da normalerweise?
cu,
-ds-
Hallo Baumus,
was mir da gerade noch einfällt.
Der Raspberry Pi aktiviert beim Booten die serielle Schnittstelle, um z.B. Bootmeldungen über die serielle Schnittstelle an ein anderes Gerät zu senden. Darüber kann man sich dann sogar auch einloggen.
Ich vermute, dass diese Betriebsart es verhindert, dass Du über [font="Courier New"]/etc/rc.local[/font] während des Bootens irgendwas mit der seriellen Schnittstelle anstellen kannst. Sie ist einfach für andere Aufgaben blockiert.
Dies bestärkt mich immer mehr, dass die serielle Schnittstelle für Deine Anwendung erst dann reibungslos zur Verfügung steht, wenn Deine Anwendung erst nach Abschluss eines vollständigen Hochfahr-Prozesses in Aktion tritt.
[font="Courier New"]/etc/rc.local[/font] ist dann definitiv das falsche Mittel. Alle bisher berichteten Beobachtungen bestätigen dies.
Den Quellcode schaue ich mir mal an. Ich glaube aber momentan nicht, dass dort die Ursache für die Problematik stecken kann.
Beste Grüße
Andreas
es geht dabei nicht um Programmieren sondern darum, eine Datei zu verändern.
nano oder was benutz Du da normalerweise?
Ach so - ja verwende nano.
Automatisch zusammengefügt:
[font="Courier New"]/etc/rc.local[/font] ist dann definitiv das falsche Mittel.
Ok, danke. Hab das eigentlich eh schon abgehackt. Hab es jetzt mit einer eigenen sh-Datei im Verzeichnis /etc/init.d angelegt. Diese hat den folgenden Inhalt:
#! /bin/sh
### BEGIN INIT INFO
# Provides: Autostart
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Autostart
# Description: Startet die Einlese.exe
### END INIT INFO
case "$1" in
start)
/usr/bin/mono /home/pi/Desktop/Einlesen.exe
;;
stop)
echo "Stoppe meinScript"
;;
restart)
echo "Restarte meinScript"
;;
*)
echo "(start|stop|restart)"
;;
esac
exit 0
Alles anzeigen
Anschließend habe ich den Befehl
eingegeben.
Antwort:
Ergebnis: Es passiert nichts.
Allerdings glaube ich dass es daran liegt, dass dass ich unter dem "runlevel" keinen "Link" erstellt habe. Allerdings blicke ich da nicht ganz durch...
mfg
____________
EDIT: Habe ein runlevel 5.
Holla ... da bist Du ja schon eigenständig weit vorgalloppiert :thumbs1:
da ist ein Fehler in dem Aufruf ... sieht zumindest so aus weil zwei prompt-Zeichen erscheinen.
Das würde nämlich alles auf den ersten Blick passen ...
Probier' das mit dem Kommando noch mal.
"sudo update-rc.d testSchript.sh defaults"
sollte reichen ...
//EDIT: den Link erzeugt der Aufruf
cu,
-ds-
Holla ... da bist Du ja schon eigenständig weit vorgalloppiert :thumbs1:
Danke danke
"sudo update-rc.d testSchript.sh defaults"
Habe ich eingegeben.
Antwort:
:s
//EDIT: den Link erzeugt der Aufruf
Ah ok^^
Hi,
da fehlt scheinbar noch ein "chmod +x testScript.sh" ... danach noch mal probieren ...
cu,
-ds-
Das Problem ist mit ziehmlicher Sicherheit dass du in deinem Programm keinen Absoluten/Vollständigen Pfad bei der Logdatei verwendest und sie somit nicht da erstellt wird(wurde) wo du sie erwartest:
const string filename = "AusgeleseneDaten.dat";
...
FileStream fs = new FileStream(filename, FileMode.Append);
...
Ich hatte mal mit einem über die /etc/rc.local gestartetem Shellskript getestet was in diesem Fall passiert: Die Datei wurde dann einfach unter / erstellt.
Poste mal die Ausgabe von:
Das klingt auch sehr danach:
Zitat
Habe wohl zw. bin/mono ein Leerzeichen gehabt - habe das entfernt und jetzt passiert genau das selbe wie bisher: es startet mono im Hintergrund (durch "top" bestätigt) allerdings wird das Programm an sich nicht ausgeführt.
Das Programm wird fehlerfrei ausgeführt.
Hi joh,
Das Problem ist mit ziehmlicher Sicherheit ...
das ist ein sehr guter Hinweis ... stimmt, das kann evtl. sogar für einen Abbruch sorgen.
Also nach dem chmod +x und Anpassen des Dateipfades sollte das Problem dann behoben sein ...
cu,
-ds-
Hallo Joh,
Das Problem ist mit ziehmlicher Sicherheit dass du in deinem Programm keinen Absoluten/Vollständigen Pfad bei der Logdatei verwendest und sie somit nicht da erstellt wird(wurde) wo du sie erwartest:
wie der Lateiner sagt:
veni vidi vici
:thumbs1:
Beste Grüße
Andreas
da fehlt scheinbar noch ein "chmod +x testScript.sh" ... danach noch mal probieren ...
Ausgabe:
usage: update-rc.d [-n] [-f] <basename> remove
update-rc.d [-n] <basename> disabel|enable [S|2|3|4|5]
-n: not really
-f: force
The disable|ebable API is not stable and might change in the future.
Ähm ich weiß nicht was ich damit anfangen soll...
Funktionieren tuts auf jeden Fall noch nicht.
Automatisch zusammengefügt:
Eingabe:
Ausgabe:
Hätte ich was anderes eingeben sollen?
Hi,
...
Ähm ich weiß nicht was ich damit anfangen soll...
...
na ohne die zugehörige Befehlszeile, die diesen Fehler auslöst, bringt das jetzt erst mal gar nichts ...
-ds-
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!