2009-08-14 12 views
0

Der Benutzer, Administratoren und Support-Mitarbeiter benötigen detaillierte Laufzeit-und Überwachungsinformationen von einem Daemon in C entwickelt. In meinem Fall sind diese Informationen z.Laufzeitinformationen in C-Daemon

  • der aktuelle Systemzustand, wie Durchsatz (MB/s), die bereits geschriebene Daten, ...
  • die aktuelle Konfiguration

ich JMX in der Java-Welt und die procfs verwenden würde (oder sysfs) für ein Kernelmodul. Eine Protokolldatei scheint nicht der beste Weg zu sein.

Was ist der beste Weg für eine solche Informationsschnittstelle für einen C-Daemon?

Ich dachte über das Öffnen eines Sockets und die Implementierung eines Bare-Metal-HTTP- oder xmlrpc-Servers, aber das scheint übertrieben zu sein. Was sind Alternativen?

+0

Eine Protokolldatei ist normalerweise die beste Lösung erster Ordnung. –

+0

Was ist mit einem gemeinsamen Speicher? – philant

Antwort

1

Sie könnten auf einem UNIX-Domain-Socket hören und schreiben Sie regelmäßig schreiben den aktuellen Status (sagen wir einmal pro Sekunde) an jeden, der sich mit ihm verbindet. Sie müssen kein Protokoll wie HTTP oder XMLRPC implementieren - da die Kommunikation nur in eine Richtung erfolgt, schreiben Sie nur eine einzige Zeile im Klartext, die den Status enthält.

1

Wenn Sie trotzdem eine relationale Datenbank verwenden, erstellen Sie eine andere Tabelle und füllen Sie sie so oft wie nötig mit dem aktuellen Status. Wenn Sie keine relationale Datenbank haben, schreiben Sie den Status in eine Datei und implementieren Sie ein Rotationsschema, um das Überschreiben einer Datei zu verhindern, die gerade von jemandem gelesen wird.

+2

Die Verwendung eines RDBMS zur Protokollierung ist keine gute Idee - wie protokolliert man "Datenbankverbindungsfehler"? Ein Protokoll sollte den einfachsten verfügbaren Mechanismus verwenden, der am wenigsten wahrscheinlich ist. –

+0

Ich habe nicht vorgeschlagen, es für die Protokollierung zu verwenden, noch fragte das OP nach Protokollierung. Stattdessen wollte er den aktuellen Status abfragen (kein historischer).Ich stimme völlig zu, dass die Fehlerberichterstattung einen sehr einfachen Mechanismus verwenden sollte - aber ich glaube, das war nicht die Frage. –

+0

OK, ich glaube auch, dass ein RDBMS eine schlechte Lösung für den Austausch von Informationen zwischen Prozessen in Echtzeit ist. Wenn Ihre GUI (oder was auch immer) die Datenbank nach Statusänderungen fragt, ist dies eine schlechte Lösung, IMHO. –

0

In eine Datei schreiben. Verwenden Sie ein Dateisperrprotokoll, um atomare Lese- und Schreibvorgänge zu erzwingen. Alles, was du stimmst, wird funktionieren. Es gibt wahrscheinlich eine UUCP-Sperrbibliothek, die Sie verwenden können. In einem früheren Leben habe ich einen für Linux gefunden. Ich habe es auch von Grund auf neu implementiert. Es ist ziemlich trivial, das auch zu tun.

Überprüfen Sie die lockdev (3) -Bibliothek unter Linux. Es ist für Geräte, aber es kann auch für normale Dateien funktionieren.

+0

Normalerweise benötigen Sie keine Sperre für Protokolle. –

+0

Ich schlug nicht vor, dass das OP eine Protokolldatei verwendet. Ich dachte an eine kleine Datei, die einen Schnappschuss der genannten Daten enthielt. Die Datei hätte eine feste Größe, und alle Daten würden sich an bekannten Orten befinden. Daher würde die Aktualisierung eine Form der Sperrung erfordern, um ungültige Lesevorgänge zu verhindern. –

4

Sie können einen Signalhandler in Ihrem Daemon verwenden, der beispielsweise auf USR1 reagiert und Informationen an den Bildschirm/log/net sendet. Auf diese Weise können Sie dem Prozess einfach ein USR1-Signal senden, wenn Sie die Informationen benötigen.

+0

+1. SIGINFO ist eine gute Wahl. – outis

0

Ich mag die Sockelidee am besten. Es ist nicht erforderlich, HTTP oder ein beliebiges RPC-Protokoll zu unterstützen. Sie können ein einfaches anwendungsspezifisches Protokoll erstellen, das angeforderte Informationen zurückgibt. Wenn der Server immer die gleichen Informationen zurückgibt, ist die Behandlung eingehender Anfragen trivial, obwohl der triviale Ansatz zu Problemen führen kann, wenn Sie die möglichen Abfragen erweitern möchten. Der Hauptgrund für die Verwendung eines bereits vorhandenen Protokolls besteht darin, vorhandene Bibliotheken und Tools zu nutzen.

Apropos Nutzung, eine andere Option ist die Verwendung von SNMP und der Zugriff auf den Daemon als eine verwaltete Komponente. Wenn Sie den Daemon remote abfragen/verwalten müssen, hat diese Option ihre Vorteile, kann sich aber andererseits als größer als ein HTTP-Server herausstellen.