#!/bin/sh set -e SCRIPT_DIR=`dirname $0` RELEASE_ROOT_DIR=`cd $SCRIPT_DIR/.. && pwd` REL_NAME={{ rel_name }} REL_VSN={{ rel_vsn }} ERTS_VSN={{ erts_vsn }} REL_DIR=$RELEASE_ROOT_DIR/releases/$REL_VSN ERL_OPTS={{ erl_opts }} PIPE_DIR=/tmp/erl_pipes/{{ rel_name }}/ RUNNER_LOG_DIR=${RUNNER_LOG_DIR:-$RELEASE_ROOT_DIR/log} find_erts_dir() { local erts_dir=$RELEASE_ROOT_DIR/erts-$ERTS_VSN if [ -d "$erts_dir" ]; then ERTS_DIR=$erts_dir; ROOTDIR=$RELEASE_ROOT_DIR else local erl=`which erl` local erl_root=`$erl -noshell -eval "io:format(\\"~s\\", [code:root_dir()])." -s init stop` ERTS_DIR=$erl_root/erts-$ERTS_VSN ROOTDIR=$erl_root fi } find_sys_config() { local possible_sys=$REL_DIR/sys.config if [ -f "$possible_sys" ]; then SYS_CONFIG="-config $possible_sys" fi } # Use $CWD/vm.args if exists, otherwise releases/APP_VSN/vm.args, or else etc/vm.args if [ -z "$VMARGS_PATH" ]; then if [ -e "$RELEASE_ROOT_DIR/vm.args" ]; then VMARGS_PATH=$RELEASE_ROOT_DIR/vm.args USE_DIR=$RELEASE_ROOT_DIR else USE_DIR=$REL_DIR if [ -e "$REL_DIR/vm.args" ]; then VMARGS_PATH="$REL_DIR/vm.args" else VMARGS_PATH="$REL_DIR/vm.args" fi fi fi # Make sure log directory exists mkdir -p $RUNNER_LOG_DIR # Use releases/VSN/sys.config if it exists otherwise use etc/app.config if [ -z "$CONFIG_PATH" ]; then if [ -e "$USE_DIR/sys.config" ]; then CONFIG_PATH="$USE_DIR/sys.config" else if [ -e "$REL_DIR/sys.config" ]; then CONFIG_PATH="$REL_DIR/sys.config" else CONFIG_PATH="$REL_DIR/app.config" fi fi fi # Extract the target node name from node.args NAME_ARG=`egrep '^-s?name' $VMARGS_PATH` if [ -z "$NAME_ARG" ]; then echo "vm.args needs to have either -name or -sname parameter." exit 1 fi # Extract the name type and name from the NAME_ARG for REMSH REMSH_TYPE=`echo $NAME_ARG | awk '{print $1}'` REMSH_NAME=`echo $NAME_ARG | awk '{print $2}'` # Note the `date +%s`, used to allow multiple remsh to the same node transparently REMSH_NAME_ARG="$REMSH_TYPE remsh`date +%s`@`echo $REMSH_NAME | awk -F@ '{print $2}'`" REMSH_REMSH_ARG="-remsh $REMSH_NAME -boot start_clean" # Extract the target cookie COOKIE_ARG=`grep '^-setcookie' $VMARGS_PATH` if [ -z "$COOKIE_ARG" ]; then echo "vm.args needs to have a -setcookie parameter." exit 1 fi find_erts_dir find_sys_config export ROOTDIR=$RELEASE_ROOT_DIR export BINDIR=$ERTS_DIR/bin export EMU=beam export PROGNAME=erl export LD_LIBRARY_PATH=$ERTS_DIR/lib:$LD_LIBRARY_PATH cd $ROOTDIR # Setup remote shell command to control node REMSH="$BINDIR/erl $REMSH_NAME_ARG $REMSH_REMSH_ARG $COOKIE_ARG" # Setup command to control the node NODETOOL="$BINDIR/escript $ROOTDIR/bin/nodetool $NAME_ARG $COOKIE_ARG" # Check the first argument for instructions case "$1" in start|start_boot) # Make sure there is not already a node running #RES=`$NODETOOL ping` #if [ "$RES" = "pong" ]; then # echo "Node is already running!" # exit 1 #fi case "$1" in start) shift START_OPTION="console" HEART_OPTION="start" ;; start_boot) shift START_OPTION="console_boot" HEART_OPTION="start_boot" ;; esac RUN_PARAM=$(printf "'%s' " "$@") HEART_COMMAND="$SCRIPT_DIR/bin/$REL_NAME $HEART_OPTION $RUN_PARAM" export HEART_COMMAND mkdir -p $PIPE_DIR $BINDIR/run_erl -daemon $PIPE_DIR $RUNNER_LOG_DIR "exec $RELEASE_ROOT_DIR/bin/$REL_NAME $START_OPTION $RUN_PARAM" 2>&1 ;; stop) # Wait for the node to completely stop... case `uname -s` in Linux|Darwin|FreeBSD|DragonFly|NetBSD|OpenBSD) # PID COMMAND PID=`ps ax -o pid= -o command=| grep "$SCRIPT_DIR/.*/[b]eam"|awk '{print $1}'` ;; SunOS) # PID COMMAND PID=`ps -ef -o pid= -o args=| grep "$SCRIPT_DIR/.*/[b]eam"|awk '{print $1}'` ;; CYGWIN*) # UID PID PPID TTY STIME COMMAND PID=`ps -efW|grep "$SCRIPT_DIR/.*/[b]eam"|awk '{print $2}'` ;; esac $NODETOOL stop ES=$? if [ "$ES" -ne 0 ]; then exit $ES fi while `kill -0 $PID 2>/dev/null`; do sleep 1 done ;; restart) ## Restart the VM without exiting the process $NODETOOL restart ES=$? if [ "$ES" -ne 0 ]; then exit $ES fi ;; reboot) ## Restart the VM completely (uses heart to restart it) $NODETOOL reboot ES=$? if [ "$ES" -ne 0 ]; then exit $ES fi ;; ping) ## See if the VM is alive $NODETOOL ping ES=$? if [ "$ES" -ne 0 ]; then exit $ES fi ;; attach) # Make sure a node IS running RES=`$NODETOOL ping` ES=$? if [ "$ES" -ne 0 ]; then echo "Node is not running!" exit $ES fi shift exec $BINDIR/to_erl $PIPE_DIR ;; remote_console) # Make sure a node IS running RES=`$NODETOOL ping` ES=$? if [ "$ES" -ne 0 ]; then echo "Node is not running!" exit $ES fi shift exec $REMSH ;; upgrade|downgrade|install) if [ -z "$2" ]; then echo "Missing package argument" echo "Usage: $REL_NAME $1 {package base name}" echo "NOTE {package base name} MUST NOT include the .tar.gz suffix" exit 1 fi # Make sure a node IS running RES=`$NODETOOL ping` ES=$? if [ "$ES" -ne 0 ]; then echo "Node is not running!" exit $ES fi node_name=`echo $NAME_ARG | awk '{print $2}'` erlang_cookie=`echo $COOKIE_ARG | awk '{print $2}'` exec $BINDIR/escript $ROOTDIR/bin/install_upgrade.escript $REL_NAME $node_name $erlang_cookie $2 ;; console|console_clean|console_boot) # .boot file typically just $REL_NAME (ie, the app name) # however, for debugging, sometimes start_clean.boot is useful. # For e.g. 'setup', one may even want to name another boot script. case "$1" in console) [ -f $REL_DIR/$REL_NAME.boot ] && BOOTFILE=$REL_DIR/$REL_NAME || BOOTFILE=$REL_DIR/start ;; console_clean) BOOTFILE=$ROOTDIR/bin/start_clean ;; console_boot) shift BOOTFILE="$1" shift ;; esac # Setup beam-required vars EMU=beam PROGNAME=`echo $0 | sed 's/.*\\///'` CMD="$BINDIR/erlexec -boot $BOOTFILE -env ERL_LIBS $REL_DIR/lib -config $CONFIG_PATH -args_file $VMARGS_PATH" export EMU export PROGNAME # Dump environment info for logging purposes echo "Exec: $CMD" -- ${1+"$@"} echo "Root: $ROOTDIR" # Log the startup logger -t "$REL_NAME[$$]" "Starting up" # Start the VM exec $CMD -- ${1+"$@"} ;; foreground) # start up the release in the foreground for use by runit # or other supervision services [ -f $REL_DIR/$REL_NAME.boot ] && BOOTFILE=$REL_NAME || BOOTFILE=start FOREGROUNDOPTIONS="-noinput +Bd" # Setup beam-required vars EMU=beam PROGNAME=`echo $0 | sed 's/.*\\///'` CMD="$BINDIR/erlexec $FOREGROUNDOPTIONS -boot $REL_DIR/$BOOTFILE -mode embedded -config $CONFIG_PATH -args_file $VMARGS_PATH" export EMU export PROGNAME # Dump environment info for logging purposes echo "Exec: $CMD" -- ${1+"$@"} echo "Root: $ROOTDIR" # Start the VM exec $CMD -- ${1+"$@"} ;; *) echo "Usage: $REL_NAME {start|start_boot |foreground|stop|restart|reboot|ping|console|console_clean|console_boot |attach|remote_console|upgrade}" exit 1 ;; esac exit 0