【问题标题】:Why can't I stop Solr from running?为什么我不能阻止 Solr 运行?
【发布时间】:2012-09-02 17:38:14
【问题描述】:

我使用的sunspot_solr 版本是1.3.3。

我正在使用sunspot_solr gem 来启动和停止 Solr 的本地实例。我使用以下命令来启动它:

rake sunspot:solr:start

和下面的命令来停止它:

rake sunspot:solr:stop

但是,停止不起作用。我注意到pids文件夹中写的pid不是正确的。

当我开始时,我可以在ps -ef | grep 'java' 命令上看到以下输出:

1000      4758  4752  0 20:32 ?        00:00:00 sh -c java -Djetty.port\=8982 -Dsolr.data.dir\=/home/panayotis/my_documents/ezMTA/solr/data/development -Dsolr.solr.home\=/home/panayotis/my_documents/ezMTA/solr -Djava.util.logging.config.file\=/tmp/logging.properties20120902-4758-13patuu -jar start.jar

1000      4761  4758  7 20:32 ?        00:00:01 java -Djetty.port=8982 -Dsolr.data.dir=/home/panayotis/my_documents/ezMTA/solr/data/development -Dsolr.solr.home=/home/panayotis/my_documents/ezMTA/solr -Djava.util.logging.config.file=/tmp/logging.properties20120902-4758-13patuu -jar start.jar

这意味着真正的服务器进程是 pid "4761" 的那个。进程“4758”仅用于在 shell 中启动服务器。

当我看到 pid 文件时:

cat solr/pids/development/sunspot-solr-development.pid
4758

这意味着rake sunspot:solr:stop 正在杀死“4758”并让“4761”继续运行。

【问题讨论】:

    标签: ruby-on-rails-3 sunspot-rails sunspot-solr


    【解决方案1】:

    这是一个错误!

    1000      4758  4752  0 20:32 ?        00:00:00 sh -c java -Djetty.port\=8982 -    Dsolr.data.dir\=/home/panayotis/my_documents/ezMTA/solr/data/development -Dsolr.solr.home\=/home/panayotis/my_documents/ezMTA/solr -Djava.util.logging.config.file\=/tmp/logging.properties20120902-4758-13patuu -jar start.jar
    
    1000      4761  4758  7 20:32 ?        00:00:01 java -Djetty.port=8982 -Dsolr.data.dir=/home/panayotis/my_documents/ezMTA/solr/data/development -Dsolr.solr.home=/home/panayotis/my_documents/ezMTA/solr -Djava.util.logging.config.file=/tmp/logging.properties20120902-4758-13patuu -jar start.jar
    

    因为进程4758是前台进程,而进程4761是后台进程,所以如果你杀死pid 4758,它不会破坏他的子进程4761,init进程将成为进程4761的父进程!

    在 sunspot_solr/lib/sunspot/solr/server.rb #line 103

    exec(Shellwords.shelljoin(command))
    

    Shellwords.shelljoin(command) 是一个字符串,但是Kernel#exec描述:

    exec([env,] command... [,options])
    

    如果给定单个字符串作为命令,则将其视为命令行,在执行之前需要进行 shell 扩展。标准 shell 在类 Unix 系统上始终表示“/bin/sh”。

    所以,它会启动两个进程。

    使用这个: 执行(*命令)

    将启动一个进程,因此 rake sunspot:solr:stop 将正常工作。

    see this pull request

    【讨论】:

      【解决方案2】:

      我已经降级到'sunspot_solr', '1.3.1',现在可以正常使用了。

      【讨论】:

        【解决方案3】:

        像这样设置环境 - RAILS_ENV=production rake sunspot:solr:stop

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-16
          • 2020-10-18
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多