如何自动启动 Solr?

Posted

技术标签:

【中文标题】如何自动启动 Solr?【英文标题】:How to start Solr automatically? 【发布时间】:2011-01-10 04:22:00 【问题描述】:

目前我必须去/usr/java/apache-solr-1.4.0/example然后做:

java -jar start.jar

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

我在一个共享的 Linux 服务器上。

【问题讨论】:

【参考方案1】:

由于您使用的是共享的 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/etc/rc3.d/K01solr/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

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

手动启动 solr:

% /etc/init.d/solr start

【讨论】:

我是管理员,运行chkconfig --add solr时得到service solr does not support chkconfig,需要调用什么启动脚本?只是索尔?没有扩展? 你可以随意调用 /etc/init.d 中的脚本。如果 chkconfig 不能正常运行,请手动创建链接(ln -s 命令)。这就是 chkconfig 所做的一切......只是为您提供了一个很好的工具。啊...还要确保 init.d 中的 solr 脚本是可执行的: chmod +x /etc/init.d/solr (或任何你称之为的) 没有骰子,Starting solr: /bin/bash: java: command not found % /etc/init.d/solr start 时出错,并且它仍然无法在启动时运行 嗨,我在哪里可以得到守护进程?谢谢 @bluedaniel 用于在运行 chkconfig --add solr 时修复 service solr does not support chkconfig 错误,您应该在第一行之后将 # chkconfig# description 指令添加到 /etc/init.d/solr 脚本的顶部(在“#!/bin/sh”之后)像这样:# chkconfig: 2345 95 05# description: Starts & Stops apache solr process.。欲了解更多信息,请参阅here。【参考方案2】:

如果您对您的机器具有 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

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

$ 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 系统支持它(通常支持),这将确保您的脚本在启动时运行。

如果我没有上面的任何错别字,它应该适合你。告诉我进展如何。

【讨论】:

这很有帮助。谢谢! 在启动时使用 cron 启动某些东西是个非常糟糕的主意 @k0pernikus 因为 cron 用于定期执行命令,而不是响应触发器。仅仅因为你可以做某事并不意味着你应该做,除非绝对必要,否则将某些东西放在不属于它的地方是不好的做法。 实际上,对于没有 root 权限的普通用户,cron @reboot 是重启后启动进程的唯一标准方法。我认为使用它没有问题。 我同意,这并没有错,从管理员的角度来看,这是首选,因为它很容易监控任何用户的任何 cron 进程,这比只是为每个用户随机添加进程到启动要好得多用户请求【参考方案3】:

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

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

【讨论】:

感谢您添加此内容 - 我试图弄清楚为什么我的 init 脚本给出消息“服务 solr 不支持 chkconfig” 感谢您实际回答这个问题,而不是提供一个骇人听闻的解决方法! 我可以确认这适用于 Red Hat。我让它在两台 RHEL 7 服务器上运行。很难把所有事情都做好,但最终我做到了。有很大帮助的是使用 bin/install_solr_service.sh 将 Solr 安装为服务。我没有使用此处 *** 答案中显示的任何自定义脚本,但确实需要将 chkconfig cmets 添加到 /etc/init.d/solr 的顶部,然后执行“chkconfig --add solr”。【参考方案4】:

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

    创建脚本,使其可执行,并将其放在正确的位置。 使脚本在重新启动时正常启动。 奖励:设置 logrotation 脚本,这样日志就不会失控。

首先,我从上面调整了 supermagic 的脚本。没问题,但是有一些拼写错误,缺少某些功能(状态、重新启动),没有非常有效地使用守护程序实用程序。

这是我的脚本版本(确保您已安装 daemon 以使其正常工作):

#!/bin/sh # 先决条件: # 1. Solr需要安装在/usr/local/solr/example # 2. 需要安装守护进程 # 3.脚本需要root执行 # 此脚本将以一种模式启动 Solr,如果它会自动重生 # 崩溃。输出将被发送到 /var/log/solr/solr.log。一个pid文件将是 # 在标准位置创建。 开始 () echo -n "正在启动 solr..." # 启动守护进程 守护进程 --chdir='/usr/local/solr/example' --command "java -jar start.jar" --respawn --output=/var/log/solr/solr.log --name=solr --冗长的 RETVAL=$? 如果 [ $RETVAL = 0 ] 然后 回声“完成”。 别的 回声“失败。有关更多信息,请参阅错误代码。” 菲 返回 $RETVAL 停止 () # 停止守护进程 echo -n "正在停止 solr..." 守护进程 --stop --name=solr --verbose RETVAL=$? 如果 [ $RETVAL = 0 ] 然后 回声“完成”。 别的 回声“失败。有关更多信息,请参阅错误代码。” 菲 返回 $RETVAL 重新开始 () 守护进程 --restart --name=solr --verbose 状态 () # 报告守护进程的状态 守护进程 --running --verbose --name=solr 返回$? 案例“$1”在 开始) 开始 ;; 状态) 状态 ;; 停止) 停止 ;; 重新开始) 重新开始 ;; *) echo $"用法:solr start|status|stop|restart" 3号出口 ;; 经社理事会 退出 $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 正在运行(通常是这样),您应该一切顺利。

【讨论】:

当您说要确保安装了守护程序时,您链接到commons.apache.org/daemon - 但是安装该软件包不会使命令守护程序可用,并且该站点上的文档使它看起来像一个 java 类它被合并到一个java项目中(所以对于solr,守护进程必须是solr的一部分)。我错过了什么吗? (我猜我是 ;-)【参考方案5】:

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

与my other answer 一样,您需要在这里做三件事:

    创建脚本并将其放在正确的位置。 使脚本在重新启动时正常启动。 奖励:使 systemd 日志持久化。

1。创建脚本并将其放置在正确的位置

这是您可以使用的systemd 单元文件(这些文件替换了 SysV 初始化文件)。将其命名为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 创建的所有标准输出和标准错误,并将存储在a binary format 下的/var/log/journal/ 中。

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

journalctl -u solr -f

还有一些标志用于进行基于日期的过滤和类似的事情。

3.1 调整日志文件

奖金部分!如果你想调整日志文件,你可以read all about it in the documentation here,但默认值实际上非常安全和理智(日志默认压缩,不能增长太大,有速率限制,批量写入磁盘) .

【讨论】:

谢谢!在 Ubuntu 16.10 上工作。【参考方案6】:

关注supermagic的cmets,然后关注这个

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

他说,

1 – 将您的脚本复制到 /etc/init.d 文件夹中 2 - cd /etc/init.d 3 – chmod +x myscript 4 – 在 #!/bin/bash 或 #!/bin/sh 之后添加这些行,包括 #: # chkconfig: 2345 95 20 # 描述:一些描述 # 你的脚本做了什么(虽然不确定这是否必要) # 进程名:myscript

那你就可以了

chkconfig --add myscript

【讨论】:

【参考方案7】:

在 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 $?

【讨论】:

这是什么:PIDFILE=/var/run/solr.pid -- 我已经搜索了我的 solr 安装目录,没有带有 pid 扩展名的文件。【参考方案8】:

检查

man 5 crontab

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

【讨论】:

以上是关于如何自动启动 Solr?的主要内容,如果未能解决你的问题,请参考以下文章

在 Elastic Beanstalk 部署后自动重启 SolR

一个由于springboot自动配置所产生的问题的解决

如何让应用开机自动启动

如何让手机qq开机自动启动

请教在断电后如何自动启动虚拟机?

如何让Chrome开机自动启动