4

I recently spun up a vagrant server and wanted to get Elasticsearch going on it. So, I installed Oracle Java and ES on a "chef/Centos-6.6" vagrant cloud VM. I set my Java path using a shell script in "etc/profile.d".

Here is my provisioning script:

#!/usr/bin/env bash
yum -y update

wget -O /opt/jdk-7u67-linux-x64.tar.gz --no-cookies --no-check-certificate --header   "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u67-b01/jdk-7u67-linux-x64.tar.gz"
tar xzf /opt/jdk-7u67-linux-x64.tar.gz -C /opt/
touch /etc/profile.d/java.sh
echo "export JAVA_HOME=/opt/jdk1.7.0_67" >> /etc/profile.d/java.sh
echo "export JRE_HOME=/opt/jdk1.7.0_67/jre" >> /etc/profile.d/java.sh
echo "export PATH=$PATH:/opt/jdk1.7.0_67/bin:/opt/jdk1.7.0_67/jre/bin" >> /etc/profile.d/java.sh

rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
REPO="[elasticsearch-1.3]
name=Elasticsearch repository for 1.3.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1"
echo "$REPO" > /etc/yum.repos.d/elasticsearch.repo
yum install -y elasticsearch

The install all goes fine. However, when I run "sudo service elasticsearch start" I get:

which: no java in (/sbin:/usr/sbin:/bin:/usr/bin)

but if I "echo $PATH" for home user i get:

/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk1.7.0_67/bin:/opt/jdk1.7.0_67/jre/bin:/home/vagrant/bin

and for root user $PATH i get:

/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk1.7.0_67/bin:/opt/jdk1.7.0_67/jre/bin

and "echo $JAVA_HOME" i get:

/opt/jdk1.7.0_67

if I run "which java" i get:

/opt/jdk1.7.0_67/bin/java

and if I run "java" it shows up with the man page.

How is it that elasticsearch is not looking in my path for java? Why is it only looking in the default Centos path? What am i missing here?

patrickbarker
  • 393
  • 1
  • 4
  • 13

1 Answers1

2

The source of your problem is probably that init scripts (Elastic init script in this case) don't see most environment variables (eg JAVA_HOME, JRE_HOME, etc).

If you look at the ElasticSearch init script, you will see that PATH variable is set explicitly in that init script and JAVA_HOME is determined by looping through predefined set of possible locations:

JDK_DIRS="/usr/lib/jvm/jdk-7-oracle-x64 /usr/lib/jvm/java-7-oracle /usr/lib/jvm/java-7-openjdk /usr/lib/jvm/java-7-openjdk-amd64/ /usr/lib/jvm/java-7-openjdk-armhf /usr/lib/jvm/java-7-openjdk-i386/ /usr/lib/jvm/default-java"

So you could put your Java installation for example to /usr/lib/jvm/jdk-7-oracle-x64 directory and the init script should pick it up.

Update

Looking at the init script I noticed that you can set JAVA_HOME in /etc/default/elasticsearch to skip looping through the predefined JDK locations as mentioned above (Source).

Bohuslav Burghardt
  • 33,626
  • 7
  • 114
  • 109
  • Awesome, this was driving me crazy. From what I read it seemed like "/etc/profile.d" would set these variables globally, i guess this is the exception. thanks for clearing this up – patrickbarker Nov 01 '14 at 22:59
  • 1
    @patrickbarker `/etc/profile.d/` does indeed set variables globally. But if you look at `man service` it mentions that it strips almost all environment variables so that the service can run in most predictable environment. I believe that if the service starts during system startup these variables might not be set yet, so it's probably best that the script does not depend on them. But I'm not 100% sure about this last part :) Maybe some Linux expert could confirm that. Anyways, I'm glad it worked for you :) – Bohuslav Burghardt Nov 02 '14 at 08:47
  • @BohuslavBurghardt, both links to Github are broken. – António Ribeiro Nov 21 '16 at 12:51