如何自动启动Solr?

时间:2010-01-27 22:25:03

标签: linux solr shared boot

目前我必须前往/usr/java/apache-solr-1.4.0/example,然后执行:

java -jar start.jar

如何让它在启动时自动启动?

我在共享的Linux服务器上。

8 个答案:

答案 0 :(得分:76)

当你在共享的Linux机器上时,你可能要求系统管理员执行以下操作。

/etc/init.d/solr中创建启动脚本。

将此代码(我的Solr启动脚本)复制到该文件中:

#!/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

然后运行:

  

chkconfig --add solr

或(在Ubuntu上):

  

update-rc.d solr默认

...或者,如果您的Linux发行版没有chkconfig(或update-rc.d),请将/etc/init.d/solr链接到/etc/rc3.d/S99solr/etc/rc5.d/S99solr以及{ {1}}和/etc/rc3.d/K01solr

/etc/rc5.d/K01solr

现在重新启动Solr将在运行级别3和5启动(带网络和完整GUI的控制台)。

要手动启动solr:

% 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

答案 1 :(得分:70)

如果您具有对计算机的root访问权限,则可以通过多种方法根据系统的初始化流程(init脚本,systemd等)执行此操作。

但是如果你没有root,cron有一个干净且一致的方法来在重启时执行程序。

首先,找出java在您计算机上的位置。下面的命令会告诉你它在哪里:

$ which java

然后,将以下代码粘贴到shell脚本中,将下面的java路径(/ usr / bin)替换为您从上面的命令获得的路径。

#!/bin/bash

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

您可以将此脚本保存在某个位置(例如$ HOME)作为start.sh。通过运行以下命令为其提供世界执行权限(以简化):

$ chmod og+x start.sh

现在,测试脚本并确保它从命令行正常工作。

$ ./start.sh

如果一切正常,则需要将其添加到计算机的某个启动脚本中。最简单的方法是将以下行添加到 /etc/rc.local 的末尾。

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

或者,如果您没有编辑rc.local的权限,则可以将其添加到用户crontab中。首先在命令行上键入以下内容:

$ crontab -e

这会打开一个编辑器。添加以下行:

@reboot /home/somedir/start.sh

如果您的Linux系统支持它(它通常会支持它),这将确保您的脚本在启动时运行。

如果我上面没有任何拼写错误,它应该适合你。让我知道它是怎么回事。

答案 2 :(得分:14)

将以下行添加到我的/etc/init.d/solr文件中以支持Red Hat Linux(我在阅读其他人的评论后从/etc/init.d/mysql复制了它们。)

# Comments to support chkconfig on Red Hat Linux
# chkconfig: 2345 64 36
# Description: A very fast and reliable search engine.

答案 3 :(得分:12)

您需要在此处执行三个步骤:

  1. 创建脚本,使其可执行,并将其放在正确的位置。
  2. 在重新启动时使脚本正常启动。
  3. Bonus:设置一个logrotation脚本,以便日志不会失控。
  4. 首先,我从上面调整了supermagic的剧本。没关系,但有一些拼写错误,缺少一些功能(状态,重启),没有非常有效地使用守护进程实用程序。

    这是我的脚本版本(确保安装了daemon才能使用):

    #!/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
    

    将此脚本放在/etc/init.d/solr上,使其可执行,您应该对第一步感到满意。您现在可以使用/etc/init.d/solr start | stop | restart | status

    启动/停止/重启/状态solr守护程序

    对于第二步,在Ubuntu机器上运行以下命令(不知道Redhat):

    update-rc.d solr defaults
    

    一旦完成,你的状态就会很好,但你可能想在某些时候正确地旋转日志,所以这里是一个很好的日志配置:

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

    将该文件放在/etc/logrotate.d/solr中,假设logrotate正在运行(通常是),你应该好好去。

答案 4 :(得分:6)

我回答了这个问题once already,但答案是针对使用SysV的操作系统,而这个系统适用于越来越多使用systemd的新操作系统。

my other answer一样,您需要做三件事:

  1. 创建脚本并将其放在正确的位置。
  2. 在重新启动时使脚本正常启动。
  3. 奖励:让systemd日志持续存在。
  4. 1。创建脚本并将其放在正确的位置

    这里是您可以使用的systemd单元文件(这些文件替换了SysV init文件)。将其命名为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
    

    请注意,Solr的内存中有一个配置。您可能希望根据自己的目的进行调整。如果您有许多变量传递给systemd,则可以使用EnvironmentFile指令执行此操作。

    More documentation for these files is here

    2。使脚本在启动时正确启动

    这很简单,但有规则。要使其在启动时启动,请将文件放在/etc/systemd/system/solr.service中。 You cannot use a symlink in this directory, do not try

    在那里,你可以启用守护进程在启动时运行:

    sudo systemctl enable solr
    

    你可以通过以下方式开始,停止和定位:

    sudo systemctl {start|stop|status} solr
    

    3。使systemd日志持久化

    默认情况下,systemd日志不是持久性的,只要您重新启动系统,它们就会丢失。如果这不是你想要的,你可以通过创建一个目录来使它们持久化:

    sudo mkdir -p /var/log/journal/
    

    然后重新启动systemd日记守护程序:

    sudo systemctl restart systemd-journald
    

    一旦完成,systemd's journaling daemon将收到Solr创建的所有stdout和stderr,它将存储在/var/log/journal/下的a binary format下。

    systemd处理日志记录的方式非常简洁,如果您不熟悉它,则值得研究。与此同时,只需知道要阅读您的日志条目,您需要使用名为journalctl的新工具。例如,这将遵循您的solr日志:

    journalctl -u solr -f
    

    还有用于进行基于日期过滤的标志等等。

    3.1调整日志文件

    奖金部分!如果你想调整日志文件,你可以read all about it in the documentation here,但默认值实际上是非常安全和理智的(默认情况下压缩日志,不会变得太大,速率有限,并写入磁盘分批)。

答案 5 :(得分:3)

关注supermagic的评论,然后按照

进行操作

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

他说,

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

然后你可以做

chkconfig --add myscript

答案 6 :(得分:1)

在Centos 6 / Amazon Linux上测试的init.d / solr脚本。它包装了solr的原生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 $?

答案 7 :(得分:0)

检查

man 5 crontab

查看您正在使用的Linux系统是否支持@reboot