Folgende Aufgabenstellung:
Im Netzwerk befinden sich zwei Computer, PC1 und PC2 (beide Debian). PC1
dient zur Datenerfassung und speichert Messwerte auf seiner Festplatte
HDD1.
PC2 enthält einen Datenbankserver. Aus Energiespargründen soll PC2 nur
einmal am Tag (oder zweimal) gestartet werden und dann die Daten von PC1
abholen, um sie in die Datenbank zu schreiben.
Meine Idee
PC1 hat FTP-Server. Mit PC2 greife ich per FTP auf die Datei von PC1 zu,
lade sie und verarbeite die Daten. Dann muss ich diese Datei
löschen/umbenennen wie auch immer. Auch per FTP möglich.
Kann es passieren, dass genau zum gleichen Zeitpunkt auf die Datei
zugegriffen wird?
Ich habe drei Tasks auf PC1:
Task 1: Daten per FTP holen
Task 2: Datendatei umbenennen
Task 3: Messwerte in Datei schreiben (PC1)
Was passiert, wenn ich Task 1 ausgeführt hat, dann aber plötzlich Task 3
zwischen dem Umbenennen mir dazwischen funkt? Dann würde der letzte
Messwert nicht gelesen worden sein von Task 1, wäre aber dann beim
nächsten Auslesen nicht mehr in der Datei vorhanden, da ja durch Task 2
die Datei umbenannt wurde.
Deine Beschreibung ist etwas schwer zu parsen - vielleicht solltest Du
nochmal versuchen das etwas klarer darzustellen... aber was Du
realisieren möchtest wäre vielleicht einfach mit einer Lock-Datei zu
bewerkstelligen? Und was meist Du mit Trigger (Subject)?
HuschelWuschelBuschel schrieb:> Task 1: Daten per FTP holen> Task 2: Datendatei umbenennen> Task 3: Messwerte in Datei schreiben (PC1)>> Was passiert, wenn ich Task 1 ausgeführt hat, dann aber plötzlich Task 3> zwischen dem Umbenennen mir dazwischen funkt? Dann würde der letzte> Messwert nicht gelesen worden sein von Task 1, wäre aber dann beim> nächsten Auslesen nicht mehr in der Datei vorhanden, da ja durch Task 2> die Datei umbenannt wurde.
Das vermeidest Du, indem Du das Umbenennen auf dem staendig laufenden
Rechner und zuerst machst.
Du kannst auch das Umbenennen zyklisch je Minute/Stunde/Tag/... machen.
Dann holt der PC2 eben alle Dateien. (wenn es nicht stoert, dass da die
letzten Daten noch nicht dabei sind)
wendelsberg
Ja, mit Trigger meinte ich eine zweite Variante.
Wenn PC 2 hochgefahren ist, dann könnte PC2 irgendwie ein Triggersignal
an PC1 senden "Ich bin jetzt empfangsbereit, Du kannst mir deine Daten
zusenden".
PC1 würde dann die Daten dierekt in die Datenbank von PC2 schreiben,
nicht, dass PC2 sich die Daten holt und selber verarbeitet.
Aber da weis ich garnicht, wie ich ein Trigger im Netzwerk realisieren
soll, dann müsste ich ja auf PC1 einen Dienst erstellen, der auf einem
Port lauscht, ob ein Triggersignal kommt, dass ist irgendwie zu
kompliziert, die eine Variante mit dem FTP-Zugriff erscheint mir
einfacher. Ich habe einfach meine Überschrift nicht mehr angepasst.
Die Idee mit der Lock-Datei ist gut, ich muss in meine kleinen Programme
einfach eine Abrage einbauen, ob die Datei grade belegt ist oder nicht
und ggf. einfach eine kleine Zeit warten bis die Datei dann wieder frei
ist.
Wenn ich "Datenbank" lese, so kannst Du Dir zuerst mal eine Menge
Geraffel mit Lock-Dateien etc. sparen, wenn Du einfach von PC1 eine
Verbindung zur Datenbank auf PC2 herstellst. MySQL oder was in der
Preislage kümmert sich dann schon um Locks und Transaktionen uswusf.
Das mit dem Trigger stellst Du Dir vielleicht zu kompliziert vor.
Auf dem PC1 lauscht ein Programm einfach auf einem Port. Sobald PC2
aufwacht schickt er eine Nachricht über das Netz an diesen Port resp.
den Lauscher: "Ich bin wach.". Dann öffnet der PC1 auf PC2 die
Datenbank, schickt die Daten und sagt PC2 am Ende (der auch wieder auf
einem Port lauscht) "Ich habe fertig".
Bitflüsterer schrieb:> Das mit dem Trigger stellst Du Dir vielleicht zu kompliziert vor.> Auf dem PC1 lauscht ein Programm einfach auf einem Port. Sobald PC2> aufwacht schickt er eine Nachricht über das Netz an diesen Port resp.> den Lauscher: "Ich bin wach.". Dann öffnet der PC1 auf PC2 die> Datenbank, schickt die Daten und sagt PC2 am Ende (der auch wieder auf> einem Port lauscht) "Ich habe fertig".
Vielen Dank für Deine Antwort. Dass war meine ursprüngliche Idee
gewesen.
Kannst du mir vielleicht ein paar Tipps für die richtigen Stichworte
nennen, die ich in die Suchmaschine eintippen kann, um so einen
Lausche-Dienst zu realisieren oder welche Programme/Dienste man dafür
verwenden kann?
>Kannst du mir vielleicht ein paar Tipps für die richtigen Stichworte
nennen, ...
"IPC", "Inter process communication", "TCP/IP", "Socket", "port".
Zum reinlesen vielleich mal:
http://www.cs.cf.ac.uk/Dave/C/node28.html#SECTION002800000000000000000
In C solltest Du möglichst schon sattelfest sein.
Vielen Dank für Eure Antworten. Hab jetzt mir mal die Wikis zu (x)inetd
angeschaut.
Es wird auf die Datei /etc/services verwiesen.
Dort steht z.B.
1
ftp-data20/tcp#FileTransfer[DefaultData]
2
ftp-data20/udp#FileTransfer[DefaultData]
3
ftp21/tcp#FileTransfer[Control]
4
telnet23/tcp#Telnet
5
telnet23/udp#Telnet
6
http80/tcp#WorldWideWebHTTP
7
http80/udp#WorldWideWebHTTP
8
www80/tcp#WorldWideWebHTTP
9
www80/udp#WorldWideWebHTTP
Handelt es sich dabei um ausführbare Programme? telnet z.B. kann ich von
der Kommandozeile aufrufen, www, ftp-data beispielsweise nicht.
Ich hab es jetzt so verstanden, sobald ein Signal auf den Port geschickt
wird, startet indetd den dazugehörigen Dienst wie z.B. den www-Dienst.
Sind Dienste kleine ausführbare Programme, die ich auch per
Kommandozeile aus starten kann?
Ich weiss ja nicht wie Konrad das sieht, aber ich würde sagen, arbeite
Dich erstmal in die Grundlagen ein. Ein Programm das auf einem Port
lauscht ud darauf reagiert. Ein Programm das auf einem Port sendet und
die Reaktion abholt.
Das inetd ist die Luxus-Variante, die auf den vorher erworbenen
Kenntnissen aufbaut. Um die zu verstehen musst Du erstmal die Grundlagen
verstehen.
Viele kleine Files schreiben, z.b. nur die Meßwerte von 5 Min in ein
File.
Und nach dem close() die Files umbennen, z.b. in *.ready.
Und dann nur die *.ready Files pollen oder pushen.
Fertich!
HuschelWuschelBuschel schrieb:> Handelt es sich dabei um ausführbare Programme? telnet z.B. kann ich von> der Kommandozeile aufrufen, www, ftp-data beispielsweise nicht.
Wie startet man ftp-data aus der Bash?
> Sind Dienste kleine ausführbare Programme, die ich auch per> Kommandozeile aus starten kann?
Nichts anderes macht inetd.
/etc/services beschreibt nur das Mapping von Namen ("http") zu Zahlen
bzw. Port-Nummern (80).
Dem inetd wird in seiner Konfiguration gesagt, auf welchen Ports er
lauschen soll und welches Programm er bei einer eingehenden Verbindung
auf einem bestimmten Port ausführen soll. So kann bei einer eingehenden
Verbindung auf TCP-Port 21 z.B. der FTP-Server-Prozess gestartet werden.
Diese Methode bietet sich bei FTP dann an, wenn nur selten
FTP-Verbindungen genutzt werden. Für "hauptberufliche" FTP-Server lässt
man den FTP-Server-Prozess besser als Dämon laufen.
Der Witz beim inetd ist, dass das "Server-Programm" auch ein einfaches
Shell-Script sein kann. Die von "draußen" reinkommenden TCP-Daten landen
ganz einfach als stdin im Script. Das stdout vom Script geht per TCP
wieder nach "draußen". Als Client kann man nc bzw. netcat, telnet, sock
oder Ähnliches verwenden. Angemerkt sei noch, dass in einem nicht
vollständig abgeschotteten Netzwerk der Einsatz von tcpd als
Mindestabsicherung angebracht ist.