से जुड़ी एक प्रक्रिया को मारना मैं किसी प्रकार का पर्यवेक्षक लिखना चाहता हूं और मैं बाहरी प्रोग्राम को बंद करने वाले फ़ंक्शन को लागू करने की कोशिश कर रहा हूं। बाहरी प्रक्रिया एक बंदरगाह के साथ एक erlang के कोड से जुड़ा हुआ है। मुझे नहीं पता कि सिग्नल या कुछ और भेजकर, इस कार्यक्रम को कैसे बंद किया जाए। बंदरगाह बंद करना एक समाधान नहीं है, क्योंकि मैंने जांच की है कि कई कार्यक्रम सिगिप पर बाहर नहीं निकलते हैं। क्या आपको कोई विचार है कि यह कैसे करें?एर्लंग के बंदरगाह
उत्तर
आप
{os_pid, OsPid} = erlang:port_info(Port, os_pid).
उपयोग कर सकते हैं ओएस में प्रक्रिया की पीआईडी प्राप्त करने के लिए (http://erlang.org/doc/man/erlang.html#port_info-1 देखते हैं - मुझे लगता है कि आप इस के लिए Erlang का नवीनतम संस्करण की आवश्यकता हो सकती शामिल होने के लिए, मैं एक के बाद स्थापित लगता है Ubuntu 12.04 पर apt-get मैं जानता हूँ कि R15B02 हालांकि यह है) और फिर
os:cmd(io_lib:format("kill -9 ~p", [OsPid])).
यह (http://erlang.org/doc/man/os.html#cmd-1) को मारने के लिए नया नहीं है,।
यह मेरे लिए काम करता है, लेकिन क्या आप समझा सकते हैं कि आप हत्या संकेत क्यों भेजते हैं? यह सिर्फ उदाहरण है या इस तरह प्रक्रिया को खत्म करने के कुछ कारण हैं? –
आपने पूछा कि प्रक्रिया को कैसे मारना है :) आप erlang: port_command/2 का उपयोग कर बंदरगाह पर प्रक्रिया को एक संदेश भी भेज सकते हैं और इसे धीरे-धीरे रोकने के लिए कह सकते हैं। –
यदि आप लिंक किए गए एरलांग प्रक्रिया को मार देते हैं तो आप बाहरी प्रक्रिया को मार सकते हैं। इस तरह का प्रयोग करें:
-module(portest).
-export([start/1, init/1, kill/0]).
start(ExtPrg) ->
spawn(?MODULE, init, [ExtPrg]).
init(ExtPrg) ->
process_flag(trap_exit, true),
Port = open_port({spawn, ExtPrg}, [{packet, 2}]),
register(extport, self()),
loop(Port).
kill() ->
exit(whereis(extport), kill).
लेकिन आप आईओ पढ़ने के साथ अवरुद्ध बाहरी प्रक्रिया को मार नहीं सकते हैं।
क्या यह एक ही मशीन पर है? क्या आपके पास पीआईडी है? –