2013-02-22 76 views
0

運行一個程序我在二郎開發程序殺進程,在二郎山

我運行這個程序使用此命令:

./build.sh && ./deploy.sh ./erl_start.sh 

我想知道在功能上做了測試驗證這是存儲在我的程序文件model.erl

在功能驗證我應該找到並殺死我的pr的過程ogram(當前程序) ,我想運行的程序

verify(Val)-> 
if Val =:=40 -> 
%% kill the process of my program 
%% run this commande ./build.sh && ./deploy.sh ./erl_start.sh 

true -> ok 

end. 

,所以我認爲我將與

verify(Val)-> 
    if Val =:=40 -> 
    exit(Pid,Reason), %% but I should know the pid of the current program 
    os_cmd("./build.sh && ./deploy.sh ./erl_start.sh"); 

    true -> ok 

    end. 

嘗試瞭解當前PROGRAMM的PID - >我有一個應用程序,它運行在該應用程序的代碼,我應該有辦法知道,爲了使這個應用程序的PID它停止

目前

我嘗試使用此功能:

verify(Val)-> 
    if Val =:=40 -> 
Pid = self(), 

io:format("~w~n",[Pid]), 
spawn(fun() -> exit(Pid, kill) end), 
    LsOut = os:cmd("./build.sh && ./deploy.sh && ./erl_start.sh"); 

    true -> ok 

    end. 

,當我測試這個功能,我有這樣的錯誤:

1> model:verify(40). 
<0.144.0> 
** exception exit: killed 

我的目標是:

我有一個應用程序在二郎山開發運行該應用程序我需要做的:運行./build.sh & & ./deploy.sh & & ./erl_start.sh

我想打一個函數(在我們的情況下,它是功能驗證),將做同樣的事情按Ctrl + C和之後都運行./build.sh & & ./deploy.sh & & ./erl_start的.sh meanig停止應用程序並再次運行此應用程序

我也考驗你的命令,我有這樣的結果:

1> [io:format("~p : ~p~n",[Pid,erlang:process_info(Pid,current_function)]) || Pid <- processes()]. 
<0.0.0> : {current_function,{init,loop,1}} 
<0.3.0> : {current_function,{erl_prim_loader,loop,3}} 
<0.5.0> : {current_function,{gen_event,fetch_msg,5}} 
<0.6.0> : {current_function,{gen_server,loop,6}} 
<0.8.0> : {current_function,{application_master,main_loop,2}} 
<0.9.0> : {current_function,{application_master,loop_it,4}} 
<0.10.0> : {current_function,{gen_server,loop,6}} 
<0.11.0> : {current_function,{gen_server,loop,6}} 
<0.12.0> : {current_function,{gen_server,loop,6}} 
<0.13.0> : {current_function,{global,loop_the_locker,1}} 
<0.14.0> : {current_function,{global,collect_deletions,2}} 
<0.15.0> : {current_function,{global,loop_the_registrar,0}} 
<0.16.0> : {current_function,{gen_server,loop,6}} 
<0.18.0> : {current_function,{gen_server,loop,6}} 
<0.19.0> : {current_function,{gen_server,loop,6}} 
<0.20.0> : {current_function,{code_server,loop,1}} 
<0.21.0> : {current_function,{gen_server,loop,6}} 
<0.22.0> : {current_function,{standard_error,server_loop,1}} 
<0.23.0> : {current_function,{gen_server,loop,6}} 
<0.24.0> : {current_function,{user_drv,server_loop,5}} 
<0.25.0> : {current_function,{group,server_loop,3}} 
<0.26.0> : {current_function,{group,server_loop,3}} 
<0.27.0> : {current_function,{shell,shell_rep,4}} 
<0.28.0> : {current_function,{gen_server,loop,6}} 
<0.29.0> : {current_function,{gen_server,loop,6}} 
<0.36.0> : {current_function,{application_master,main_loop,2}} 
<0.37.0> : {current_function,{application_master,loop_it,4}} 
<0.38.0> : {current_function,{gen_server,loop,6}} 
<0.39.0> : {current_function,{gen_event,fetch_msg,5}} 
<0.40.0> : {current_function,{gen_server,loop,6}} 
<0.41.0> : {current_function,{gen_server,loop,6}} 
<0.44.0> : {current_function,{gen_server,loop,6}} 
<0.45.0> : {current_function,{mnesia_locker,loop,1}} 
<0.46.0> : {current_function,{gen_server,loop,6}} 
<0.47.0> : {current_function,{mnesia_tm,doit_loop,1}} 
<0.48.0> : {current_function,{gen_server,loop,6}} 
<0.49.0> : {current_function,{gen_server,loop,6}} 
<0.53.0> : {current_function,{gen_server,loop,6}} 
<0.54.0> : {current_function,{gen_server,loop,6}} 
<0.63.0> : {current_function,{disk_log,loop,1}} 
<0.65.0> : {current_function,{gen_server,loop,6}} 
<0.66.0> : {current_function,{gen_server,loop,6}} 
<0.67.0> : {current_function,{gen_server,loop,6}} 
<0.68.0> : {current_function,{gen_server,loop,6}} 
<0.69.0> : {current_function,{mnesia_late_loader,loop,1}} 
<0.105.0> : {current_function,{application_master,main_loop,2}} 
<0.106.0> : {current_function,{application_master,loop_it,4}} 
<0.107.0> : {current_function,{gen_server,loop,6}} 
<0.108.0> : {current_function,{gen_server,loop,6}} 
<0.109.0> : {current_function,{gen_server,loop,6}} 
<0.110.0> : {current_function,{gen_server,loop,6}} 
<0.111.0> : {current_function,{gen_server,loop,6}} 
<0.112.0> : {current_function,{gen_server,loop,6}} 
<0.113.0> : {current_function,{gen_server,loop,6}} 
<0.114.0> : {current_function,{gen_server,loop,6}} 
<0.115.0> : {current_function,{gen_server,loop,6}} 
<0.117.0> : {current_function,{gen_server,loop,6}} 
<0.118.0> : {current_function,{gen_server,loop,6}} 
<0.119.0> : {current_function,{gen_server,loop,6}} 
<0.120.0> : {current_function,{gen_server,loop,6}} 
<0.121.0> : {current_function,{prim_inet,accept0,2}} 
<0.123.0> : {current_function,{gen_server,loop,6}} 
<0.124.0> : {current_function,{gen_server,loop,6}} 
<0.125.0> : {current_function,{gen_server,loop,6}} 
<0.126.0> : {current_function,{gen_server,loop,6}} 
<0.127.0> : {current_function,{prim_inet,accept0,2}} 
<0.129.0> : {current_function,{gen_server,loop,6}} 
<0.130.0> : {current_function,{gen_server,loop,6}} 
<0.131.0> : {current_function,{gen_server,loop,6}} 
<0.132.0> : {current_function,{gen_server,loop,6}} 
<0.133.0> : {current_function,{prim_inet,accept0,2}} 
<0.135.0> : {current_function,{gen_server,loop,6}} 
<0.136.0> : {current_function,{gen_server,loop,6}} 
<0.137.0> : {current_function,{gen_server,loop,6}} 
<0.138.0> : {current_function,{gen_server,loop,6}} 
<0.139.0> : {current_function,{prim_inet,accept0,2}} 
<0.140.0> : {current_function,{gen_server,loop,6}} 
<0.143.0> : {current_function,{os,start_port_srv_loop,2}} 
<0.144.0> : {current_function,{erl_eval,do_apply,5}} 
[ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok, 
ok,ok,ok,ok,ok,ok,ok,ok,ok,ok|...] 

,並與第二個命令我:

1> [io:format("~p : ~p~n",[Pid,erlang:process_info(Pid,initial_call)]) || Pid <- processes()]. 
<0.0.0> : {initial_call,{otp_ring0,start,2}} 
<0.3.0> : {initial_call,{erlang,apply,2}} 
<0.5.0> : {initial_call,{proc_lib,init_p,5}} 
<0.6.0> : {initial_call,{erlang,apply,2}} 
<0.8.0> : {initial_call,{proc_lib,init_p,5}} 
<0.9.0> : {initial_call,{application_master,start_it,4}} 
<0.10.0> : {initial_call,{proc_lib,init_p,5}} 
<0.11.0> : {initial_call,{proc_lib,init_p,5}} 
<0.12.0> : {initial_call,{proc_lib,init_p,5}} 
<0.13.0> : {initial_call,{erlang,apply,2}} 
<0.14.0> : {initial_call,{erlang,apply,2}} 
<0.15.0> : {initial_call,{erlang,apply,2}} 
<0.16.0> : {initial_call,{proc_lib,init_p,5}} 
<0.18.0> : {initial_call,{proc_lib,init_p,5}} 
<0.19.0> : {initial_call,{proc_lib,init_p,5}} 
<0.20.0> : {initial_call,{erlang,apply,2}} 
<0.21.0> : {initial_call,{proc_lib,init_p,5}} 
<0.22.0> : {initial_call,{standard_error,server,2}} 
<0.23.0> : {initial_call,{proc_lib,init_p,5}} 
<0.24.0> : {initial_call,{user_drv,server,2}} 
<0.25.0> : {initial_call,{group,server,3}} 
<0.26.0> : {initial_call,{group,server,3}} 
<0.27.0> : {initial_call,{erlang,apply,2}} 
<0.28.0> : {initial_call,{proc_lib,init_p,5}} 
<0.29.0> : {initial_call,{proc_lib,init_p,5}} 
<0.36.0> : {initial_call,{proc_lib,init_p,5}} 
<0.37.0> : {initial_call,{application_master,start_it,4}} 
<0.38.0> : {initial_call,{proc_lib,init_p,5}} 
<0.39.0> : {initial_call,{proc_lib,init_p,5}} 
<0.40.0> : {initial_call,{proc_lib,init_p,5}} 
<0.41.0> : {initial_call,{proc_lib,init_p,5}} 
<0.44.0> : {initial_call,{proc_lib,init_p,5}} 
<0.45.0> : {initial_call,{proc_lib,init_p,5}} 
<0.46.0> : {initial_call,{proc_lib,init_p,5}} 
<0.47.0> : {initial_call,{proc_lib,init_p,5}} 
<0.48.0> : {initial_call,{proc_lib,init_p,5}} 
<0.49.0> : {initial_call,{proc_lib,init_p,5}} 
<0.53.0> : {initial_call,{proc_lib,init_p,5}} 
<0.54.0> : {initial_call,{proc_lib,init_p,5}} 
<0.63.0> : {initial_call,{proc_lib,init_p,5}} 
<0.65.0> : {initial_call,{proc_lib,init_p,5}} 
<0.66.0> : {initial_call,{proc_lib,init_p,5}} 
<0.67.0> : {initial_call,{proc_lib,init_p,5}} 
<0.68.0> : {initial_call,{proc_lib,init_p,5}} 
<0.69.0> : {initial_call,{proc_lib,init_p,5}} 
<0.105.0> : {initial_call,{proc_lib,init_p,5}} 
<0.106.0> : {initial_call,{application_master,start_it,4}} 
<0.107.0> : {initial_call,{proc_lib,init_p,5}} 
<0.108.0> : {initial_call,{proc_lib,init_p,5}} 
<0.109.0> : {initial_call,{proc_lib,init_p,5}} 
<0.110.0> : {initial_call,{proc_lib,init_p,5}} 
<0.111.0> : {initial_call,{proc_lib,init_p,5}} 
<0.112.0> : {initial_call,{proc_lib,init_p,5}} 
<0.113.0> : {initial_call,{proc_lib,init_p,5}} 
<0.114.0> : {initial_call,{proc_lib,init_p,5}} 
<0.115.0> : {initial_call,{proc_lib,init_p,5}} 
<0.117.0> : {initial_call,{proc_lib,init_p,5}} 
<0.118.0> : {initial_call,{proc_lib,init_p,5}} 
<0.119.0> : {initial_call,{proc_lib,init_p,5}} 
<0.120.0> : {initial_call,{proc_lib,init_p,5}} 
<0.121.0> : {initial_call,{proc_lib,init_p,5}} 
<0.123.0> : {initial_call,{proc_lib,init_p,5}} 
<0.124.0> : {initial_call,{proc_lib,init_p,5}} 
<0.125.0> : {initial_call,{proc_lib,init_p,5}} 
<0.126.0> : {initial_call,{proc_lib,init_p,5}} 
<0.127.0> : {initial_call,{proc_lib,init_p,5}} 
<0.129.0> : {initial_call,{proc_lib,init_p,5}} 
<0.130.0> : {initial_call,{proc_lib,init_p,5}} 
<0.131.0> : {initial_call,{proc_lib,init_p,5}} 
<0.132.0> : {initial_call,{proc_lib,init_p,5}} 
<0.133.0> : {initial_call,{proc_lib,init_p,5}} 
<0.135.0> : {initial_call,{proc_lib,init_p,5}} 
<0.136.0> : {initial_call,{proc_lib,init_p,5}} 
<0.137.0> : {initial_call,{proc_lib,init_p,5}} 
<0.138.0> : {initial_call,{proc_lib,init_p,5}} 
<0.139.0> : {initial_call,{proc_lib,init_p,5}} 
<0.140.0> : {initial_call,{proc_lib,init_p,5}} 
<0.143.0> : {initial_call,{erlang,apply,2}} 
<0.144.0> : {initial_call,{erlang,apply,2}} 
[ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok,ok, 
ok,ok,ok,ok,ok,ok,ok,ok,ok,ok|...] 

回答

0

您可以使用exit(Pid,Reason),然後使用os_cmd/1函數來執行您的命令。

如果你要重新啓動虛擬機,ERL應該具有-Heart和使用的初始化啓動:重啓重啓虛擬機

+0

但是我怎麼才能知道程序的pid, – 2013-02-22 16:58:24

+0

使用:[erlang:self/0](http://erlang.org/doc/man/erlang.html#self-0),然後程序會自行終止並且[os:cmd/1](http://www.erlang.org/doc/man/os.html#cmd-1)永遠不會運行? – emil 2013-02-24 16:56:33

+0

你可以產生另一個過程,它爲你做 – Vinod 2013-02-24 18:13:43

0

你所能使用的功能erlang:processes()的虛擬機中運行的進程的PID知道。然後使用erlang:process_info/1 or /2您可以獲取有關當前功能,初始呼叫者的信息...

例如從shell叫你可以打印:

1> [io:format("~p : ~p~n",[Pid,erlang:process_info(Pid,current_function)]) || Pid <- processes()]. 
<0.0.0> : {current_function,{init,loop,1}} 
<0.3.0> : {current_function,{erl_prim_loader,loop,3}} 
<0.5.0> : {current_function,{gen_event,fetch_msg,5}} 
<0.6.0> : {current_function,{gen_server,loop,6}} 
... 

或:

2> [io:format("~p : ~p~n",[Pid,erlang:process_info(Pid,initial_call)]) || Pid <- processes()].  
<0.0.0> : {initial_call,{otp_ring0,start,2}} 
<0.3.0> : {initial_call,{erlang,apply,2}} 
<0.5.0> : {initial_call,{proc_lib,init_p,5}} 
<0.6.0> : {initial_call,{erlang,apply,2}} 

如果更換IO:通過您的殺傷作用篩選上正確的初始主叫格式/ 2,它可以做到這一點。

除此之外,我不完全明白你打算做什麼。一般情況下,一個進程被殺死,虛擬機不會停止,除非你爲此寫了一些代碼(我從來沒有嘗試過,但應該是可行的)。在這種情況下,您應該使用opion -heart和init:reboot重新啓動VM,如@Vinod所述。

但是,控制和重新啓動進程的常用方法是在VM 中使用主管樹。然後,您可以調整重啓策略,以獲得良好的可靠性,同時也是一項很好的服務。同樣,@Vinod說,網站learnyousomeerlang.com是你的朋友。幾乎你會發現你需要編寫符合OTP標準的應用程序。

+0

謝謝你的回答,我更新了我的問題 – 2013-02-27 10:42:59