2013-06-12 6 views
5

मैं एक Erlang आवेदन की निगरानी के साथ काम कर रहा हूँ और मैं वर्तमान में निर्धारित करने के लिए कितनी देर तक एक विशिष्ट पीआईडी ​​चल रहा है कोशिश कर रहा हूँ। निरपेक्ष टाइमस्टैम्प या अवधि मेरे लिए काम करेगी, लेकिन मुझे process_info में या sys मॉड्यूल के माध्यम से डेटा के उन बिट्स में से कोई भी दिखाई नहीं देता है। क्या इस जानकारी को एरलांग वीएम के भीतर से प्राप्त करने का कोई तरीका है?प्रक्रिया शुरू होने पर एरलांग रिकॉर्ड करता है?

मैं पीएस कमांड से समग्र वीएम का प्रारंभ समय प्राप्त कर सकता हूं, लेकिन इसमें व्यक्तिगत एरलांग प्रक्रियाओं की कोई दृश्यता नहीं है।

संपादित करें:

मैंने देखा है कि यह वहाँ में है, जब वी एम क्रैश, erl_crash.dump प्रत्येक प्रक्रिया के लिए एक शुरू कर दिया टाइमस्टैम्प होता है, इसलिए मुझे पता है!

+0

वैकल्पिक रूप से (और शायद स्पष्ट बताते हुए): आप प्रक्रिया स्थिति ('gen_server: init' में) की प्रारंभ तिथि को जारी रख सकते हैं, और पूछे जाने पर 'erlang: now' के साथ अंतर वापस कर सकते हैं। –

+0

seconded, बचाने कि आप ओएस 'उपयोग करना चाहिए: टाइमस्टैम्प/0' बजाय' की erlang: अब/0'। 'अब/0' दुर्भाग्य से यह गारंटी देने के लिए वैश्विक लॉक प्राप्त करने की आवश्यकता है कि यह वापसी एकान्त रूप से बढ़ रही है और अद्वितीय है। – troutwine

+0

मुझे ऐसा करना अच्छा लगेगा, लेकिन यह मेरा आवेदन नहीं है, मैं बस इसकी निगरानी कर रहा हूं, इसलिए मैं ऐप में बदलाव नहीं कर सकता। मैं एक दूसरा वीएम शुरू करता हूं और आरपीसी के माध्यम से इसे कमांड भेजता हूं: कॉल करें। – Joe

उत्तर

2

टीएल; हाँ: लेकिन आप इसे प्राप्त नहीं कर सकते हैं।

यदि आप https://github.com/erlang/otp पर ओटीपी स्रोत कोड में खोदते हैं, तो आपको क्रैश डंप लिखने के लिए जिम्मेदार फ़ाइल को erts/emulator/beam/break.c कहा जाएगा।

के लिए "शुरू कर दिया" (यह दोनों एक अच्छा अनुमान है, और यह क्या क्रैश डंप में प्रकट होता है है) (OTP-18.3.1 टैग के आधार पर सभी लाइन नंबर) lines 248-249 को आप मिल जाएगा, जो की तरह लग रही है कि फ़ाइल सर्च कर रहे हैं इस:

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

approx_started के लिए स्रोत कोड के बाकी सर्च कर रहे हैं पता चलता है कि यह struct process के सदस्य के रूप erts/emulator/beam/erl_process.h में घोषित किया गया। यह erts/emulator/beam/erl_process.c में लिखा है। केवल जगह break.c में क्रैश डंप लिखते समय रखें।

तो, हाँ, एरलांग एक प्रक्रिया शुरू होने के अनुमानित (अनुमानित) समय रिकॉर्ड करता है। लेकिन, नहीं, आप इसे प्राप्त नहीं कर सकते हैं।

मुझे नहीं पता कि यह "अनुमानित" क्यों है।

1

मैं टूलबार में देख रहा था: प्रारंभ()। प्रक्रिया मॉनीटर और ज़िंदगी या समय init समय नहीं दिखता है, लेकिन यह बनाना आसान है। प्रक्रिया के शब्दकोश में आप इनिट के मूल्य को सहेज सकते हैं और यह प्रक्रिया इस मूल्य के बारे में अन्य प्रक्रियाओं का जवाब दे सकती है।

शब्दकोश प्रक्रिया में पढ़ने के मूल्य के लिए आप get/1 का उपयोग कर सकते हैं और उपयोग/2 (पहली कुंजी और दूसरा मान) सहेजने के लिए उपयोग कर सकते हैं।

इस मूल्य के बारे में अन्य प्रक्रिया का जवाब है कि दूसरों की प्रतिक्रियाएं, आदि

+0

यह निश्चित रूप से काम करेगा, लेकिन एप्लिकेशन को स्वयं बदलने की आवश्यकता होगी। मैं इसे एक फीचर अनुरोध के रूप में सबमिट कर सकता हूं, लेकिन मैं इसे स्वयं नहीं बदल सकता। – Joe

+0

यदि आपको किसी ऐसे अनुप्रयोग के लिए इसकी आवश्यकता है जो आपके विकास से नहीं है और आप अपने आवेदन से उपयोग करते हैं, तो मैं इसे फीचर के रूप में जमा करने की सलाह देता हूं लेकिन एरलैंग वीएम विकास के लिए अन्यथा विकास को लागू नहीं करता हूं। मुझे लगता है कि यह दिलचस्प है। – JHG

3

एक प्रक्रिया है जो इस का प्रबंधन करता लिखें एक ही है। चूंकि आप दी गई प्रक्रिया के पीआईडी ​​पा सकते हैं, इसलिए आप प्रक्रिया पर monitor भी सेट कर सकते हैं। फिर, यदि प्रक्रिया त्रुटियां समाप्त होती हैं, तो आपको अपने मेलबॉक्स में एक संदेश प्राप्त होगा।

मुझे लगता है कि यह आपके लिए समाधान के लिए आधार बन सकता है।

+0

हां, पीआईडी ​​मरने पर अधिसूचित होने का यह एक शानदार तरीका है। लेकिन मैं यह शुरू करने की कोशिश भी कर रहा हूं जब यह शुरू हुआ। – Joe

संबंधित मुद्दे