Forum: PC Hard- und Software Trigger im Netzwerk realisieren


von HuschelWuschelBuschel (Gast)


Lesenswert?

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.

von Hank P. (hp67)


Lesenswert?

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)?

von wendelsberg (Gast)


Lesenswert?

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

von HuschelWuschelBuschel (Gast)


Lesenswert?

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.

von Bitflüsterer (Gast)


Lesenswert?

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".

von HuschelWuschelBuschel (Gast)


Lesenswert?

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?

von Bitflüsterer (Gast)


Lesenswert?

>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.

von Konrad S. (maybee)


Lesenswert?

HuschelWuschelBuschel schrieb:
> Tipps für die richtigen Stichworte

inetd bzw. xinetd

von HuschelWuschelBuschel (Gast)


Lesenswert?

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-data         20/tcp     # File Transfer [Default Data]
2
ftp-data         20/udp     # File Transfer [Default Data]
3
ftp              21/tcp     # File Transfer [Control]
4
telnet           23/tcp     # Telnet
5
telnet           23/udp     # Telnet
6
http             80/tcp     # World Wide Web HTTP
7
http             80/udp     # World Wide Web HTTP
8
www              80/tcp     # World Wide Web HTTP
9
www              80/udp     # World Wide Web HTTP

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?

von HuschelWuschelBuschel (Gast)


Lesenswert?

Oder müssen Dienste, wenn sie ergänzt werden, dierekt in den Kernel 
compiliert werden?

von Bitflüsterer (Gast)


Lesenswert?

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.

von toto (Gast)


Lesenswert?

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!

von toto (Gast)


Lesenswert?

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.

von Konrad S. (maybee)


Lesenswert?

/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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.