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-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?
Oder müssen Dienste, wenn sie ergänzt werden, dierekt in den Kernel compiliert werden?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.