2

この質問は私の前の質問に関連しています:デーモン/サービスとしてerlangシェルを実行する

次のようなスクリプトがあります。

#!/bin/bash
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions


export HEART_COMMAND="/etc/init.d/script restart"

start() {


        erl  -heart -pa DIR -sname NAME -setcookie COOKIE -env port 21 -s M -s M2 --
        ### Create the lock file ###
        touch /var/lock/lock
}

stop() {

        erl -noshell -sname temp_control -setcookie COOKIE -eval "rpc:call(NAME@ubuntu, init, stop, [])" -s init stop
        ### Now, delete the lock file ###
        rm -f /var/lock/lock
}


### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
       # start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0

クラッシュをシミュレートする方法がわからないので、ctrl + cを試し、シェルを中止しました。出力は次のようになります。

root@ubuntu:/etc/init.d# ./script start
heart_beat_kill_pid = 17512
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
(NAME@ubuntu)1> Starting M2
Listening on port 21

(NAME@ubuntu)1>
(NAME@ubuntu)1>
(NAME@ubuntu)1>
(NAME@ubuntu)1>
(NAME@ubuntu)1>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
heart: Fri Jul 29 09:25:10 2011: Erlang has closed.
root@ubuntu:/etc/init.d# heart_beat_kill_pid = 17557
heart: Fri Jul 29 09:25:13 2011: Erlang has closed.
/etc/init.d/NAME: line 20: 17557 Killed                  erl  -heart -pa DIR -sname NAME -setcookie COOKIE -env port 21 -s M -s M2 --
heart: Fri Jul 29 09:25:13 2011: Executed "/etc/init.d/script restart". Terminating.
heart_beat_kill_pid = 17602
heart: Fri Jul 29 09:25:15 2011: Erlang has closed.
/etc/init.d/NAME: line 20: 17602 Killed                  erl  -heart -pa DIR -sname NAME -setcookie COOKIE -env port 21 -s M -s M2 --
heart: Fri Jul 29 09:25:15 2011: Executed "/etc/init.d/script restart". Terminating.
heart: Fri Jul 29 09:25:17 2011: Executed "/etc/init.d/script restart". Terminating.

root@ubuntu:/etc/init.d#

これは、それを開始するスクリプトのコード行にコメントを付けないと、永遠に続きます。それは、erlangシェルを終了する無限のループのようなものです...または何か。

たとえば、「export HEART_COMMAND = "/ bin / echo hello」を実行しようとすると、「書き込みエラー:パイプが壊れています」と表示されます。

なぜそれが機能しないのですか?クラッシュを適切にシミュレートして、heartコマンドが機能するかどうかを確認するにはどうすればよいですか?

あなたが持っているかもしれないどんなアドバイスにも感謝します。

4

1 に答える 1

3

あなたが尋ねなかった質問に答える(しかし、あなたがやり方を知らないことを数回述べた)

クラッシュをシミュレートするにはkill -SEGV <PID>

例:

$ sleep 30 &
[1] 13274


$ kill -SEGV 13274
[1]+  Segmentation fault      sleep 30

また、erlangはわかりませんが、複数のスレッドを生成し、ハートビートメッセージを送信することで1つのスレッドが別のスレッドを監視できると思います。他のスレッドが応答しない場合は、ハングして再起動したと見なされます。

于 2011-08-01T22:29:31.660 に答える