Viren
Viren

Reputation: 5972

Why does echo never print

I have a following elasticsearch configuration file on my server.

#!/bin/sh
#
# /etc/init.d/elasticsearch -- startup script for Elasticsearch
#
# Written by Miquel van Smoorenburg <[email protected]>.
# Modified for Debian GNU/Linux by Ian Murdock <[email protected]>.
# Modified for Tomcat by Stefan Gybas <[email protected]>.
# Modified for Tomcat6 by Thierry Carrez <[email protected]>.
# Additional improvements by Jason Brittain <[email protected]>.
# Modified by Nicolas Huray for Elasticsearch <[email protected]>.
#
### BEGIN INIT INFO
# Provides:          elasticsearch
# Required-Start:    $network $remote_fs $named
# Required-Stop:     $network $remote_fs $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Starts elasticsearch
# Description:       Starts elasticsearch using start-stop-daemon
### END INIT INFO
PATH=/bin:/usr/bin:/sbin:/usr/sbin
NAME=elasticsearch
DESC="Elasticsearch Server"
DEFAULT=/etc/default/$NAME

if [ `id -u` -ne 0 ]; then
    echo "You need root privileges to run this script"
    exit 1
fi

echo "Statement before >>>>"
. /lib/lsb/init-functions
echo "Statement after >>>>>"

if [ -r /etc/default/rcS ]; then
    . /etc/default/rcS
fi

# The following variables can be overwritten in $DEFAULT

# Run Elasticsearch as this user ID and group ID
ES_USER=elasticsearch
ES_GROUP=elasticsearch

# Directory where the Elasticsearch binary distribution resides
ES_HOME=/usr/share/$NAME

# Heap size defaults to 256m min, 1g max
# Set ES_HEAP_SIZE to 50% of available RAM, but no more than 31g
#ES_HEAP_SIZE=2g

# Heap new generation
#ES_HEAP_NEWSIZE=

# max direct memory
#ES_DIRECT_SIZE=

# Additional Java OPTS
#ES_JAVA_OPTS=

# Maximum number of open files
MAX_OPEN_FILES=65535

# Maximum amount of locked memory
#MAX_LOCKED_MEMORY=

# Elasticsearch log directory
LOG_DIR=/var/log/$NAME

# Elasticsearch data directory
DATA_DIR=/var/lib/$NAME

# Elasticsearch configuration directory
CONF_DIR=/etc/$NAME

# Maximum number of VMA (Virtual Memory Areas) a process can own
MAX_MAP_COUNT=262144

# Path to the GC log file
#ES_GC_LOG_FILE=/var/log/elasticsearch/gc.log

# Elasticsearch PID file directory
PID_DIR="/var/run/elasticsearch"

# Elasticsearch Repo directory
REPO_DIR="/mnt/backups"

# End of variables that can be overwritten in $DEFAULT

# overwrite settings from default file
if [ -f "$DEFAULT" ]; then
    . "$DEFAULT"
fi
# CONF_FILE setting was removed
if [ ! -z "$CONF_FILE" ]; then
    echo "CONF_FILE setting is no longer supported. elasticsearch.yml must be placed in the config directory and cannot be renamed."
    exit 1
fi

# Define other required variables
PID_FILE="$PID_DIR/$NAME.pid"
DAEMON=$ES_HOME/bin/elasticsearch
DAEMON_OPTS="-d -p $PID_FILE --default.path.home=$ES_HOME --default.path.logs=$LOG_DIR --default.path.data=$DATA_DIR --default.path.conf=$CONF_DIR --default.path.repo=$REPO_DIR"
export ES_HEAP_SIZE
export ES_HEAP_NEWSIZE
export ES_DIRECT_SIZE
export ES_JAVA_OPTS
export ES_GC_LOG_FILE
export JAVA_HOME

# Check DAEMON exists
test -x $DAEMON || exit 0

checkJava() {
    if [ -x "$JAVA_HOME/bin/java" ]; then
        JAVA="$JAVA_HOME/bin/java"
    else
        JAVA=`which java`
    fi

    if [ ! -x "$JAVA" ]; then
        echo "Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME"
        exit 1
    fi
}

case "$1" in
  start)
    checkJava

    if [ -n "$MAX_LOCKED_MEMORY" -a -z "$ES_HEAP_SIZE" ]; then
        log_failure_msg "MAX_LOCKED_MEMORY is set - ES_HEAP_SIZE must also be set"
        exit 1
    fi

    log_daemon_msg "Starting $DESC"

    pid=`pidofproc -p $PID_FILE elasticsearch`
    if [ -n "$pid" ] ; then
        log_begin_msg "Already running.1"
        log_end_msg 0
        exit 0
    fi

    # Prepare environment
    mkdir -p "$LOG_DIR" "$DATA_DIR" && chown "$ES_USER":"$ES_GROUP" "$LOG_DIR" "$DATA_DIR"

    # Ensure that the PID_DIR exists (it is cleaned at OS startup time)
    if [ -n "$PID_DIR" ] && [ ! -e "$PID_DIR" ]; then
        mkdir -p "$PID_DIR" && chown "$ES_USER":"$ES_GROUP" "$PID_DIR"
    fi
    if [ -n "$PID_FILE" ] && [ ! -e "$PID_FILE" ]; then
        touch "$PID_FILE" && chown "$ES_USER":"$ES_GROUP" "$PID_FILE"
    fi

    if [ -n "$MAX_OPEN_FILES" ]; then
        ulimit -n $MAX_OPEN_FILES
    fi

    if [ -n "$MAX_LOCKED_MEMORY" ]; then
        ulimit -l $MAX_LOCKED_MEMORY
    fi

    if [ -n "$MAX_MAP_COUNT" -a -f /proc/sys/vm/max_map_count ]; then
        sysctl -q -w vm.max_map_count=$MAX_MAP_COUNT
    fi
        echo "Staring......."
        echo $DAEMON_OPTS
    # Start Daemon
    start-stop-daemon -d $ES_HOME --start -b --user "$ES_USER" -c "$ES_USER" --pidfile "$PID_FILE" --exec $DAEMON -- $DAEMON_OPTS
    return=$?
    if [ $return -eq 0 ]; then
        i=0
        timeout=10
        # Wait for the process to be properly started before exiting
        until { cat "$PID_FILE" | xargs kill -0; } >/dev/null 2>&1
        do
            sleep 1
            i=$(($i + 1))
            if [ $i -gt $timeout ]; then
                log_end_msg 1
                exit 1
            fi
        done
    fi
    log_end_msg $return
    exit $return
    ;;
  stop)
    log_daemon_msg "Stopping $DESC"

    if [ -f "$PID_FILE" ]; then
        start-stop-daemon --stop --pidfile "$PID_FILE" \
            --user "$ES_USER" \
            --quiet \
            --retry forever/TERM/20 > /dev/null
        if [ $? -eq 1 ]; then
            log_progress_msg "$DESC is not running but pid file exists, cleaning up"
        elif [ $? -eq 3 ]; then
            PID="`cat $PID_FILE`"
            log_failure_msg "Failed to stop $DESC (pid $PID)"
            exit 1
        fi
        rm -f "$PID_FILE"
    else
        log_progress_msg "(not running)"
    fi
    log_end_msg 0
    ;;
  status)
    status_of_proc -p $PID_FILE elasticsearch elasticsearch && exit 0 || exit $?
    ;;
  restart|force-reload)
    if [ -f "$PID_FILE" ]; then
        $0 stop
        sleep 1
    fi
    $0 start
    ;;
  *)
    log_success_msg "Usage: $0 {start|stop|restart|force-reload|status}"
    exit 1
    ;;
esac

exit 0

Notice the

echo "Statement before >>>>"
. /lib/lsb/init-functions
echo "Statement after >>>>>"

Now , ever time I run the above script I see the Statement before >>>> getting printed but not Statement after >>>>

Reason: I have made few changes on my DAEMON_OPTS variable but every time I restart the elasticsearch, I don't see that options getting applied(when I do ps aux | grep elasticsearch)

enter image description here

@rici:

Distributor ID: Debian
Description:    Debian GNU/Linux 8.3 (jessie)
Release:    8.3
Codename:   jessie

dpkg -S "$(ps -ocmd= 1)"
systemd-sysv: /sbin/init

Upvotes: 0

Views: 1072

Answers (2)

Viren
Viren

Reputation: 5972

Please do read the @rici answer for the explanation. The following answer just contain few added information.

So, as @rici pointed out.

Like upstart, systemd modifies /lib/lsb/init-functions

If you closely examine the /lib/lsb/init-functions

The last few lines look like this.

for hook in $(run-parts --lsbsysinit --list /lib/lsb/init-functions.d 2>/dev/null); do
    [ -r $hook ] && . $hook || true
done

Here where the /lib/lsb/init-functions.d/40-systemd is invoked(or called)

Also,one must want to read this as well

Upvotes: 0

rici
rici

Reputation: 241921

Your server is using the systemd init system, which means that you might not be able to just edit init.d scripts and expect the changes to be reflected in your startup process.

Like upstart, systemd modifies /lib/lsb/init-functions. In SysV, this file is just a collection of useful shell functions, which are used by almost all init scripts. So the file is included near the start of pretty well every init script. (Debian's package linter actually checks to make sure that this is the case.) So systemd (and upstart) can insert code into this file which runs an alternative service control command. In the case of the systemd init-functions, the file calls the systemd servicectl, which uses the systemd configuration file for the service, and then exits. (Upstart execs its service controller, which has the same end effect.)

There is also a "generator" in systemd which attempts to create systemd configuration files for all legacy init.d services [Note 1], but in the case of elasticsearch this is probably not relevant, since elasticsearch seems to come with systemd configuration files.

So in order to change your elasticsearch startup configuration, you will have to modify the systemd service entry.

It seems relatively clear that the init script you show in the question is not the script that is actually being run to start the service. Compare the logging line in the script:

DESC="Elasticsearch Server"
#...
log_daemon_msg "Starting $DESC"

with the output actually being observed:

[Ok] Starting elasticsearch (via systemctl): elasticsearch.service.

No matter what log_daemon_msg does, it is not likely to change Elasticsearch Server into elasticsearch, and the actually produced output line is evidently coming from systemd.


Notes

  1. This page has an interesting discussion of the systemd legacy system -- "systemd sysv init compatibility mode is magical" -- although the first comment (from John Carver) seems interesting, too. But I don't think any of this is relevant to your issue.

Upvotes: 1

Related Questions