2017-07-28 16 views
1

Erlang: does the application behavior trap SIGTERM?Erlang:rebar3リリース、最初にビームを開始しますか?私はこの質問あたり19.3の新機能を活用しようとしています

私の理解では、BEAMにSIGTERMを送信することになりましたアーラン19.3+

で正常なシャットダウンをトリガーすることである私が使用してドッカーで自分のアプリケーションを起動します私はドッカーでこれを行うと./_build/default/rel/myapp/bin/myapprebar3 release

から生成されENTRYPOINT ./_build/default/rel/myapp/bin/myappmyappはPID1とBEAMは別のPIDを取得しているようです取得します。

異なるコマンドがあります。BEAMがPID1を取得し、そこからmyappがロードされるようなコマンドを実行できますか?何かのように

./start_beam; ./start_my_app_via_beam

docker stopがPID1にSIGTERMを送信するため、これが必要です。私はBEAMであることが必要です。上記のエントリポイントを使用して、ここでは「容器の中に何が起こるかです: top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 4340 644 556 S 0.0 0.0 0:00.01 myapp 14 root 20 0 3751188 50812 6660 S 0.0 0.6 0:00.48 beam.smp 18 root 20 0 11492 116 0 S 0.0 0.0 0:00.00 epmd 31 root 20 0 4220 680 604 S 0.0 0.0 0:00.10 erl_child_setup 53 root 20 0 11456 944 840 S 0.0 0.0 0:00.00 inet_gethost 54 root 20 0 17764 1660 1504 S 0.0 0.0 0:00.00 inet_gethost 55 root 20 0 20252 3208 2720 S 0.0 0.0 0:00.02 bash 61 root 20 0 21956 2468 2052 R 0.0 0.0 0:00.00 top

+0

私は 'myapp'スクリプトは' run_erl'ヘルパープログラムを使用して、バックグラウンドでErlangのVMを起動すると思われる。おそらく、それにはいくつかのオプションがありますフォアグラウンドでErlang VMを起動しますか?それはそれにPID 1を与えるはずです。 – legoscia

+1

@legosciaこのリリースはrebar3を使って 'rebar3 release'を使って生成されます。 './_ build/default/rel/myapp/bin/myapp'スクリプトは複雑です... – Tommy

答えて

0

現在、この問題を回避するために、私はこの恐ろしい獣があります。

#!/usr/bin/env bash 
echo "if testing locally send SIGTERM to $$" 

term_handler() { 
    echo "Stopping the Erlang VM gracefully" 
    #/usr/local/Cellar/erlang/19.1/lib/erlang/lib/erl_interface- 
3.9.1/bin/erl_call -c myapp -s -a 'init stop' -n '[email protected]' 
    /usr/local/lib/erlang/lib/erl_interface-3.9.2/bin/erl_call -c myapp -s -a 'init stop' -n '[email protected]' 
    echo "Erlang VM Stopped" 
} 

trap term_handler SIGQUIT SIGINT SIGTERM 

./_build/default/rel/myapp/bin/myapp & 
PID=$! 

echo "Erlang VM Started" 
#wait $PID 
while kill -0 $PID ; do wait $PID ; EXIT_STATUS=$? ; done 
echo "Exiting Wrapper." 
exit $EXIT_STATUS 
``` 

And then I do `ENTRYPOINT : ["./thisscript"]` 

をこの獣は、PID 1になり、それが見つかりましたその後殺すために正しい事。

私はこのスクリプトを取り除くためにしようとしている。

関連する問題