2013-06-12 4 views
5

Ich arbeite mit der Überwachung einer Erlang-Anwendung und versuche gerade herauszufinden, wie lange eine bestimmte PID läuft. Der absolute Zeitstempel oder die Dauer würde für mich funktionieren, aber ich sehe keines dieser Daten in process_info oder über das sys-Modul. Gibt es eine Möglichkeit, diese Informationen von der Erlang VM zu erhalten?Wird erlang aufgezeichnet, wenn ein Prozess gestartet wurde?

Ich kann die Startzeit der gesamten VM aus dem Befehl ps erhalten, aber das hat keine Sichtbarkeit einzelner Erlang-Prozesse.

Edit:

Ich habe bemerkt, dass, wenn die VM stürzt ab, die erl_crash.dump einen gestarteten Zeitstempel für jeden Prozess enthält, so dass ich weiß, dass es da drin ist!

+0

Alternativ (und vielleicht das Offensichtliche): Sie könnten das Startdatum im Prozesszustand (in 'gen_server: init') beibehalten und die Differenz mit 'erlang: now' zurückgeben, wenn Sie gefragt werden. –

+0

Abgesichert, speichern Sie, dass Sie 'os: timestamp/0' anstelle von' erlang: now/0' verwenden sollten. 'now/0' braucht leider eine globale Sperre, um sicherzustellen, dass die Rückgabe monoton ansteigt und einzigartig ist. – troutwine

+0

Ich würde das gerne machen, aber es ist nicht meine Anwendung, ich beobachte es nur, so dass ich in der App selbst keine Änderungen vornehmen kann. Ich starte eine zweite VM und sende Befehle über rpc: call. – Joe

Antwort

2

tl; dr: ja, aber Sie können nicht dazu kommen.

Wenn Sie in den Quellcode OTP graben bei https://github.com/erlang/otp, werden Sie (nach „erl_crash“), dass die Datei verantwortlich für das Schreiben von dem Crash-Dump finden erts/emulator/beam/break.c genannt wird.

Wenn Sie diese Datei nach "started" suchen (es ist eine gute Schätzung, und es ist, was im Crash-Dump erscheint), erhalten Sie lines 248-249 (alle Zeilennummern basierend auf dem OTP-18.3.1-Tag), die aussehen dies:

approx_started = (time_t) p->approx_started; 
erts_print(to, to_arg, "Started: %s", ctime(&approx_started)); 

den Rest des Quellcodes für approx_started Suche zeigt es in erts/emulator/beam/erl_process.h als Mitglied der struct process erklärt wird. Es ist geschrieben in erts/emulator/beam/erl_process.c. Die nur Platz es ist lesen ist in break.c, beim Schreiben der Absturzsicherung.

Also ja, Erlang macht notieren Sie die (ungefähre) Zeit, die ein Prozess gestartet wurde. Aber nein, du kommst nicht dazu.

Ich habe keine Ahnung, warum es "ungefähr" ist.

1

Ich suchte in der Symbolleiste: start(). der Prozess überwachen und nicht Zeit lebendig oder Zeit init aussehen, aber es ist einfach zu machen. Im Prozesswörterbuch können Sie einen Wert bei der Initialisierung speichern und dieser Prozess kann auf andere Prozesse über diesen Wert reagieren.

Für den Lesewert im Wörterbuchprozess können Sie get/1 verwenden und für die sichere Verwendung put/2 (erster Schlüssel und zweiter Wert).

Respond zu anderen Verfahren zu diesem Wert ist die gleiche, dass andere Antworten usw.

+0

Das würde definitiv funktionieren, aber würde die Anwendung selbst ändern müssen. Ich kann dies als Feature-Anfrage einreichen, aber ich kann diese Änderung nicht selbst vornehmen. – Joe

+0

Wenn Sie dies für eine Anwendung brauchen, die Sie nicht entwickeln und die Sie aus Ihrer Anwendung verwenden, empfehle ich dies als Feature, aber nicht zur Anwendungsentwicklung sonst zu Erlang VM Entwicklungen. Ich denke das ist interessant. – JHG

3

einen Prozess schreiben, die diese verwaltet. Da Sie die PID des gegebenen Prozesses finden können, können Sie auch eine monitor auf den Prozess setzen. Dann, wenn der Prozess Fehler aus, erhalten Sie eine Nachricht in Ihrem Postfach.

Ich würde vermuten, dass dies die Grundlage für eine Lösung für Sie bilden könnte.

+0

Ja, dies ist eine ausgezeichnete Methode, um benachrichtigt zu werden, wenn die PID abstirbt. Aber ich versuche auch herauszufinden, wann es angefangen hat. – Joe

Verwandte Themen