51

At the moment I have to go to /usr/java/apache-solr-1.4.0/example and then do:

java -jar start.jar

How do I get this to start automatically on boot?

I'm on a shared Linux server.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
bluedaniel
  • 2,079
  • 5
  • 31
  • 49

8 Answers8

77

As you're on a shared Linux box, you'll have to ask the system administrator to do the following, probably.

Create a startup script in /etc/init.d/solr.

Copy this code, my Solr startup script, into that file:

#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A PID file will be
# created in the standard location.

start () {
    echo -n "Starting solr..."

    # Start daemon
    daemon --chdir='/usr/local/solr/example' --command "java -jar start.jar" --respawn --output=/var/log/solr/solr.log --name=solr --verbose

    RETVAL=$?
    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}

stop () {
    # Stop daemon
    echo -n "Stopping solr..."

    daemon --stop --name=solr  --verbose
    RETVAL=$?

    if [ $RETVAL = 0 ]
    then
        echo "Done."
    else
        echo "Failed. See error code for more information."
    fi
    return $RETVAL
}


restart () {
    daemon --restart --name=solr  --verbose
}


status () {
    # Report on the status of the daemon
    daemon --running --verbose --name=solr
    return $?
}


case "$1" in
    start)
        start
    ;;
    status)
        status
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        echo $"Usage: solr {start|status|stop|restart}"
        exit 3
    ;;
esac

exit $RETVAL

Then run:

chkconfig --add solr

Or (on Ubuntu):

update-rc.d solr defaults

... or, if your Linux distribution doesn't have chkconfig (or update-rc.d), link /etc/init.d/solr to /etc/rc3.d/S99solr and /etc/rc5.d/S99solr and /etc/rc3.d/K01solr and /etc/rc5.d/K01solr:

% ln -s /etc/init.d/solr /etc/rc3.d/S99solr

% ln -s /etc/init.d/solr /etc/rc5.d/S99solr

% ln -s /etc/init.d/solr /etc/rc3.d/K01solr

% ln -s /etc/init.d/solr /etc/rc5.d/K01solr

Now on reboot Solr will startup in run levels 3 and 5 (console with network & full GUI).

To start solr manually run:

% /etc/init.d/solr start
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
SuperMagic
  • 1,398
  • 8
  • 9
  • I am admin, I get `service solr does not support chkconfig` when running `chkconfig --add solr`, what does the startup script need to be called? just solr? no extension? – bluedaniel Jan 27 '10 at 23:15
  • You can call the script in /etc/init.d whatever you like. If chkconfig isn't playing nice, make the links manually (the ln -s commands). That's really all chkconfig does... just provides a nice tool to do it for you. Ah... also make sure the solr script in init.d is executable: chmod +x /etc/init.d/solr (or whatever you called it) – SuperMagic Jan 28 '10 at 14:05
  • no dice, `Starting solr: /bin/bash: java: command not found` error when `% /etc/init.d/solr start` and it does not run on boot still – bluedaniel Feb 01 '10 at 14:21
  • It looks as if the script needs to invoke java with its absolute path. – rleir Feb 03 '10 at 18:20
  • which part of the script needs changing to reflect that? – bluedaniel Feb 05 '10 at 14:13
  • It's probably `/usr/bin/java`, not `/usr/java`. Do `whereis java` on your system and find out. – Till May 12 '10 at 13:18
  • i'm trying to create a init.d script as well for solr and copied the above code. i get the error: "daemon: invalid option -- 'j'". Any ideas? – prostock Dec 12 '10 at 21:11
  • For Ubuntu users: `. /etc/init.d/functions` doesn't exist, use: `. /etc/init.d` and the daemon won't work as listed, see: http://stackoverflow.com/questions/4420127/daemon-for-solr – hewhocutsdown Mar 23 '11 at 21:32
  • 4
    hi, where can i get daemon? Thanks – Joyce Jun 05 '12 at 21:06
  • 1
    @bluedaniel for fixing `service solr does not support chkconfig` error when running `chkconfig --add solr` you should add `# chkconfig` and `# description` directives to top of `/etc/init.d/solr` script after first line(after "`#!/bin/sh`") like this: `# chkconfig: 2345 95 05` and `# description: Starts & Stops apache solr process.`. for more info see [here](http://blog.tuxforge.com/service-does-not-support-chkconfig/). – sepehr Oct 20 '13 at 13:35
70

If you have root access to your machine, there are a number of ways to do this based on your system's initialization flow (init scripts, systemd, etc.)

But if you don't have root, cron has a clean and consistent way to execute programs upon reboot.

First, find out where java is located on your machine. The command below will tell you where it is:

$ which java

Then, stick the following code into a shell script, replacing the java path below (/usr/bin) with the path you got from the above command.

#!/bin/bash

cd /usr/java/apache-solr-1.4.0/example
/usr/bin/java -jar start.jar

You can save this script in some location (e.g., $HOME) as start.sh. Give it world execute permission (to simplify) by running the following command:

$ chmod og+x start.sh

Now, test the script and ensure that it works correctly from the command line.

$ ./start.sh

If all works well, you need to add it to one of your machine's startup scripts. The simplest way to do this is to add the following line to the end of /etc/rc.local.

# ... snip contents of rc.local ...
# Start Solr upon boot.
/home/somedir/start.sh

Alternatively, if you don't have permission to edit rc.local, then you can add it to your user crontab as so. First type the following on the commandline:

$ crontab -e

This will bring up an editor. Add the following line to it:

@reboot /home/somedir/start.sh

If your Linux system supports it (which it usually does), this will ensure that your script is run upon startup.

If I don't have any typos above, it should work out well for you. Let me know how it goes.

0xfe
  • 4,541
  • 1
  • 18
  • 14
  • 3
    Very bad idea to start something with cron on boot – dba.in.ua May 25 '12 at 10:05
  • @dba.in.ua Could you please explain why? – k0pernikus Oct 16 '12 at 14:09
  • 7
    @k0pernikus because cron is for executing commands at regular intervals, not in response to a trigger. Just because you can do something, doesn't mean you should, and it is bad practice to put something where it doesn't belong unless absolutely necessary. – Benubird Nov 26 '12 at 17:29
  • You shouldn't use crontab to init things on boot. You must use the init levels as in http://www.linuxforums.org/forum/mandriva-linux/27687-how-make-command-run-startup.html – Alexander Jardim Jun 30 '13 at 23:36
  • I already did it using crontab! Thanks! @Alexander what is wrong using crontab for this? (I'm a begginer on this subject) – Beto Aveiga Oct 16 '13 at 02:04
  • 6
    Actually, cron @reboot is the only standard way of starting processes after reboot for regular users with no root powers. I see no problems using it. – user1338062 Jan 09 '14 at 13:44
  • 1
    I agree, there is nothing wrong and from an admin perspective it is preferred, since it is easy to monitor any cron process of any user, a lot better then just randomly add processes to the startup for every user requesting that – Tobias Hagenbeek Jul 15 '14 at 18:32
14

Adding the following lines to my /etc/init.d/solr file works to support Red Hat Linux (I copied them from /etc/init.d/mysql after reading comments by others here).

# Comments to support chkconfig on Red Hat Linux
# chkconfig: 2345 64 36
# Description: A very fast and reliable search engine.
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Daniel Rijkhof
  • 461
  • 5
  • 10
  • Thanks for adding this - I was trying to figure out why my init script was giving the message "service solr does not support chkconfig" – Peter Hanley Jan 31 '13 at 14:08
  • Thank you for actually answering the question instead of offering a hackish workaround! – Joel E Salas Jun 11 '13 at 00:18
  • I can confirm that this works on Red Hat. I have it working on two RHEL 7 servers. It was hard to get everything right, but eventually I got there. What helped a lot was installing Solr as a service using bin/install_solr_service.sh. I did not use any of the custom scripts displayed in the StackOverflow answers here, but did need to add the chkconfig comments to the top of /etc/init.d/solr and then do 'chkconfig --add solr'. – arnoldbird Mar 11 '20 at 18:41
13

There are three steps that you need to do here:

  1. Create the script, make it executable, and put it in the right place.
  2. Make the script start up properly on reboot.
  3. Bonus: Set up a logrotation script so logs don't get out of control.

For number one, I've tuned supermagic's script from above. It was OK, but had a number of typos, lacked some functionality (status, restart), didn't use the daemon utility very effectively.

Here's my version of the script (make sure you have daemon installed for it to work):

#!/bin/sh

# Prerequisites:
# 1. Solr needs to be installed at /usr/local/solr/example
# 2. daemon needs to be installed
# 3. Script needs to be executed by root

# This script will launch Solr in a mode that will automatically respawn if it
# crashes. Output will be sent to /var/log/solr/solr.log. A pid file will be 
# created in the standard location.

start () {
    echo -n "Starting solr..."

    # start daemon
    daemon --chdir='/usr/local/solr/example' --command "java -jar start.jar" --respawn --output=/var/log/solr/solr.log --name=solr --verbose

    RETVAL=$?
    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}

stop () {
    # stop daemon
    echo -n "Stopping solr..."

    daemon --stop --name=solr  --verbose
    RETVAL=$?

    if [ $RETVAL = 0 ]
    then
        echo "done."
    else
        echo "failed. See error code for more information."
    fi
    return $RETVAL
}


restart () {
    daemon --restart --name=solr  --verbose
}


status () {
    # report on the status of the daemon
    daemon --running --verbose --name=solr
    return $?
}


case "$1" in
    start)
        start
    ;;
    status)
        status
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        echo $"Usage: solr {start|status|stop|restart}"
        exit 3
    ;;
esac

exit $RETVAL

Place this script at /etc/init.d/solr, make it executable, and you should be good with step one. You can now start/stop/restart/status a solr daemon with /etc/init.d/solr start|stop|restart|status

For step two, run the following on an Ubuntu machine (don't know about Redhat):

update-rc.d solr defaults

Once this is done, you're in pretty good shape, but you probably want to rotate the logs properly at some point, so here's a good config for the logs:

/var/log/solr/*.log {
  weekly
  rotate 12
  compress
  delaycompress
  create 640 root root
  postrotate
    /etc/init.d/solr restart
  endscript
}

Place that file in /etc/logrotate.d/solr, and you should be good to go, assuming logrotate is running (it usually is).

mlissner
  • 17,359
  • 18
  • 106
  • 169
  • You link to http://commons.apache.org/daemon/ when you say to make sure daemon is installed - but installing that package doesn't make a command daemon available, and the docs on that site make it seem like a java class that gets incorporated into a java project (so for solr, daemon would have to be part of solr). Am I missing something? (I'm guessing I am ;-) – Peter Hanley Jan 31 '13 at 15:24
9

I answered this question once already, but that answer was for operating systems that used SysV and this one is for newer operating systems that are increasingly using systemd.

As in my other answer, there are three things you'll need to do here:

  1. Create the script and put it in the right place.
  2. Make the script start up properly on reboot.
  3. Bonus: Make systemd logs persistent.

1. Creating the script and putting it in the right place

Here's a systemd unit file that you can use (these replace the SysV init files). Name it solr.service.

[Unit]
Description=Apache Solr
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
Environment="XMX=2G"
WorkingDirectory=/usr/local/solr/example
ExecStart=/usr/bin/java -jar -server -Xmx${XMX} start.jar
Restart=on-failure
LimitNOFILE=10000

[Install]
WantedBy=multi-user.target

Note that there's a configuration in there for Solr's memory. You'll probably want to tweak that to your own purposes. If you have a number of variables you're passing to systemd, you can do that with the EnvironmentFile directive.

More documentation for these files is here.

2. Make the script startup properly at boot

This is fairly simple, but there are rules. To make it start at boot, put the file in /etc/systemd/system/solr.service. You cannot use a symlink in this directory, do not try.

Once that's in there, you can enable the daemon to run at boot with:

sudo systemctl enable solr

And you can start, stop, status it with:

sudo systemctl {start|stop|status} solr

3. Making systemd logs persistent

By default, systemd logs are not persistent and they are lost whenever you reboot the system. If that's not what you desire, you can make them persistent by creating a directory:

sudo mkdir -p /var/log/journal/

And then restarting the systemd journaling daemon:

sudo systemctl restart systemd-journald

Once that's complete, systemd's journaling daemon will receive all the stdout and stderr that Solr creates and it will get stored in a binary format under /var/log/journal/.

The way systemd handles logging is pretty neat and is worth studying if you're not familiar with it. In the meantime, just know that to read your log entries you'll need to use a new tool called journalctl. For example, this will follow your solr logs:

journalctl -u solr -f

And there are also flags for doing date-based filtering and things like that.

3.1 Tweaking the log files

Bonus section! If you want to tweak the log files, you can read all about it in the documentation here, but the defaults are actually very safe and sane (logs are compressed by default, can't grow too large, are rate limited, and are written to disk in batches).

Community
  • 1
  • 1
mlissner
  • 17,359
  • 18
  • 106
  • 169
4

Follow supermagic's comments, then follow this

http://codingrecipes.com/service-x-does-not-support-chkconfig

He says,

1 – Copy your script into /etc/init.d folder
2 – cd /etc/init.d
3 – chmod +x myscript
4 – Add these lines, including #, right after #!/bin/bash or #!/bin/sh:

# chkconfig: 2345 95 20
# description: Some description
# What your script does (not sure if this is necessary though)
# processname: myscript

Then you can do

chkconfig --add myscript

Visitor
  • 41
  • 1
1

init.d/solr script that's tested on Centos 6/Amazon Linux. It wraps solr's native CLI.

#!/bin/bash
# description: Starts and stops Solr production


PIDFILE=/var/run/solr.pid
SOLR_HOME=/usr/share/solr
START_COMMAND="$SOLR_HOME/bin/solr start -p 8984 -noprompt -m 1g"
NAME="Solr"


start() {
  echo  "Starting $NAME"
  if [ -f $PIDFILE ]; then
    echo -n "$PIDFILE exists. $NAME may be running."
  else
    str=`$START_COMMAND`
    pid=`echo $str | grep -o "pid=[0-9]*" | grep -o "[0-9]*"`
    if [ "$pid" == "" ];
    then
      echo "[FATAL ERROR] Failed to extract pid. Exiting!"
      exit 1
    fi
    echo $pid > $PIDFILE
  fi
  return 0
}


case "$1" in
  start)
    start
  ;;
  stop)
    echo "Stopping $NAME .."
    $SOLR_HOME/bin/solr stop
    rm -f $PIDFILE
  ;;
  status)
    $SOLR_HOME/bin/solr status
  ;;
  restart)
    $0 stop
    #sleep 2
    $0 start
  ;;

  *)
    echo "Usage: $0 (start | stop | restart | status)"
    exit 1
    ;;

esac
exit $?
Mayank Jaiswal
  • 12,338
  • 7
  • 39
  • 41
  • What is this: PIDFILE=/var/run/solr.pid -- I have searched my solr install directory and there are no files with a pid extension. – arnoldbird Mar 09 '20 at 15:27
0

Check

man 5 crontab

See if @reboot is supported on the Linux system you are using.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
John La Rooy
  • 295,403
  • 53
  • 369
  • 502