如何自动启动Solr?

blu*_*iel 49 linux boot solr shared

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

java -jar start.jar
Run Code Online (Sandbox Code Playgroud)

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

我在共享的Linux服务器上.

小智 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
Run Code Online (Sandbox Code Playgroud)

然后运行:

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
Run Code Online (Sandbox Code Playgroud)

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

要手动启动solr:

% /etc/init.d/solr start
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我在哪里可以获得守护进程?谢谢 (3认同)

0xf*_*xfe 70

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

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

首先,找出java在您的计算机上的位置.以下命令将告诉您它的位置:

$ which java
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

cd /usr/java/apache-solr-1.4.0/example
/usr/bin/java -jar start.jar
Run Code Online (Sandbox Code Playgroud)

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

$ chmod og+x start.sh
Run Code Online (Sandbox Code Playgroud)

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

$ ./start.sh
Run Code Online (Sandbox Code Playgroud)

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

# ... snip contents of rc.local ...
# Start Solr upon boot.
/home/somedir/start.sh
Run Code Online (Sandbox Code Playgroud)

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

$ crontab -e
Run Code Online (Sandbox Code Playgroud)

这将带来一个编辑.添加以下行:

@reboot /home/somedir/start.sh
Run Code Online (Sandbox Code Playgroud)

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

如果我上面没有任何拼写错误,它应该适合你.让我知道事情的后续.

  • @ k0pernikus因为cron用于定期执行命令,而不是响应触发器.仅仅因为你可以做某事,并不意味着你应该这样做,除非绝对必要,否则把它放在不属于的地方是不好的做法. (7认同)
  • 实际上,对于没有root权限的普通用户,cron @reboot是重启后启动进程的唯一标准方法.我发现使用它没有问题. (6认同)
  • 非常糟糕的想法在启动时启动cron的东西 (3认同)

Dan*_*hof 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.
Run Code Online (Sandbox Code Playgroud)


mli*_*ner 12

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

  1. 创建脚本,使其可执行,并将其放在正确的位置.
  2. 在重新启动时使脚本正常启动.
  3. 奖励:设置一个logrotation脚本,以便日志不会失控.

首先,我从上面调整了supermagic的剧本.没关系,但有一些拼写错误,缺少一些功能(状态,重启),没有非常有效地使用守护进程实用程序.

这是我的脚本版本(确保你安装了守护进程才能工作):

#!/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
Run Code Online (Sandbox Code Playgroud)

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

/var/log/solr/*.log {
  weekly
  rotate 12
  compress
  delaycompress
  create 640 root root
  postrotate
    /etc/init.d/solr restart
  endscript
}
Run Code Online (Sandbox Code Playgroud)

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


mli*_*ner 6

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

我的另一个答案中,你需要做三件事:

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

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
Run Code Online (Sandbox Code Playgroud)

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

这里有更多关于这些文件的文档.

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

这很简单,但有规则.要使它在启动时启动,请将文件放入/etc/systemd/system/solr.service.您不能在此目录中使用符号链接,请勿尝试.

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

sudo systemctl enable solr
Run Code Online (Sandbox Code Playgroud)

你可以用以下方式开始,停止,定位:

sudo systemctl {start|stop|status} solr
Run Code Online (Sandbox Code Playgroud)

3.使systemd日志持久化

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

sudo mkdir -p /var/log/journal/
Run Code Online (Sandbox Code Playgroud)

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

sudo systemctl restart systemd-journald
Run Code Online (Sandbox Code Playgroud)

一旦这完成后,systemd的日志守护进程将接收所有的输出和错误是Solr的创建,它会获取存储在二进制格式/var/log/journal/.

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

journalctl -u solr -f
Run Code Online (Sandbox Code Playgroud)

还有用于进行基于日期过滤的标志以及类似的东西.

3.1调整日志文件

奖金部分!如果你想调整日志文件,你可以在这里的文档中阅读所有相关信息,但是默认值实际上是非常安全和理智的(默认情况下压缩日志,不能增长太大,速率有限,并且写入到批量磁盘).