2013-02-27 3 views
0

есть приложение, разработанное в Erlang и запустить это приложение, мне нужно сделать: ./build.sh & & ./deploy.sh & & ./erl_start.shостановка и снова запустить приложение в Эрл

Я хочу сделать функцию, которая будет делать то же самое, как Ctrl + C и запустить ./build.sh & & ./deploy.sh & & ./erl_start.sh

смысл остановить приложение и запустить снова это приложение

Я пытаюсь с помощью этой функции:

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 

Испытываю эта команда:

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|...] 

Я пытаюсь с помощью этой функции:

verify(Val) -> 
    erlang:halt(); 

verify(_) -> 
    % do nothing 

    ok. 

и когда я проверяю у меня есть этот результат:

1> model:verify(40). 
[email protected]:/home/afif/Desktop/ttest/erlang# 

это только выйти из виртуальной машины

, но, как я уже говорил, хочу остановить приложение и снова запустить это приложение

и для этого я стараюсь с:

verify(Val) -> 
     erlang:halt(), 
    LsOut = os:cmd("./build.sh && ./deploy.sh && ./erl_start.sh"); 
    verify(_) -> 
     % do nothing 

     ok. 

, но у меня есть один и тот же результат, как в предыдущем коде

, что я сделал это половина работы остается, как снова запустить программу

+0

self() - это pid процесса, на котором выполняется тестирование (оболочка), а не Pid вашего приложения. Кроме того, убийство одного из процессов вашего приложения не гарантирует, что все приложение будет убито. – Isac

+0

спасибо, но как я могу и убить pid приложения, я также обновил свой вопрос –

+0

Глядя на огромный список запущенных процессов и вызовы application_master: start_it/4 кажется, что у вас есть как минимум 2 приложения в дополнение к стандартным (kernel + stdlib). Вы должны использовать командное приложение: wich_applications(). знать их имена. Затем вы можете остановить их с помощью командного приложения: stop (Appname). Вы также можете перезапустить приложение с помощью приложения: start (Appname). – Pascal

ответ

0

Если вы хотите только выйти из виртуальной машины для перезагрузки, вы можете использовать функцию erlang: halt() или erlang: halt (Status). Из документации:

привал()

Останавливает систему выполнения Erlang и указывает на нормальный выход в вызывающей среде. Не имеет возвращаемого значения.

halt().

os_prompt%

привал (Статус)

Типы:

Status = целое число()> = 0 | Строка()

Статус должен быть неотрицательным целым числом, или строкой. Завершает работу системы Erlang . Не имеет возвращаемого значения. Если Status является целым числом, он возвращает в качестве статуса выхода Erlang в вызывающую среду. Если Состояние - это строка, создается дамп аварийной ситуации Erlang с String как слот , а затем завершается с ненулевым кодом состояния.

Обратите внимание, что на многих платформах поддерживаются только коды состояния 0-255 .

так что ваш код может быть:

verify(40) -> 
    erlang:halt(); 
verify(_) -> 
    % do nothing 
    ok. 

Но, как я сказал вам в предыдущем вопросе, я не думаю, что вы смотрите в правильном направлении.

+0

спасибо за ваш ответ, но когда я попробую с этой функцией, у меня есть: 1> model: verify (40). root @ ubuntu:/home/ubuntu/Desktop/erlang #, но я хочу снова запустить программу с этой командой: ./build.sh && ./deploy.sh && ./erl_start.sh –

+0

Я обновил свой вопрос –

+1

VM останавливается сразу после вызова erlang: halt/0. Сначала вы должны вызвать функцию os: cmd, чтобы иметь возможность перезагрузки. Но будьте осторожны, делая это, между двумя инструкциями есть условие гонки. если os: cmd достаточно быстр, VM может не иметь достаточного времени для остановки, и новая виртуальная машина может не запускаться (особенно если вы присвоите ей имя через аргумент -sname или -name). Именно поэтому хорошим способом является использование опции -heart, поэтому программа сердца позаботится о перезапуске виртуальной машины (см. Http://www.erlang.org/doc/man/heart.html). – Pascal

Смежные вопросы