2013-04-24 77 views
1

我想部署與Capistrano的太陽黑子Solr。我一直在根據這個要點設置它:https://gist.github.com/doitian/1795439沒有PID文件錯誤部署與Capistrano的太陽黑子

deploy.rb

namespace :deploy do 
    task :start do ; end 
    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 

    desc "Migrate Database" 
    task :migrate_db do 
    run "cd #{current_path} && rake db:migrate RAILS_ENV=production" 
    run "touch #{current_path}/tmp/restart.txt" 
    end 

    desc "Create Solr Directory" 
    task :setup_solr_data_dir do 
    run "mkdir -p #{shared_path}/solr/data" 
    end 
end 

namespace :solr do 
    desc "start solr" 
    task :start, :roles => :app, :except => { :no_release => true } do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec sunspot-solr start --port=8983 --data-directory=#{shared_path}/solr/data --pid-dir=#{shared_path}/pids" 
    end 
    desc "stop solr" 
    task :stop, :roles => :app, :except => { :no_release => true } do 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec sunspot-solr stop --port=8983 --data-directory=#{shared_path}/solr/data --pid-dir=#{shared_path}/pids" 
    end 
    desc "reindex the whole database" 
    task :reindex, :roles => :app do 
    stop 
    run "rm -rf #{shared_path}/solr/data" 
    start 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake sunspot:solr:reindex" 
    end 
end 

after "deploy", "deploy:cleanup", "deploy:migrate_db", 'deploy:setup_solr_data_dir', 'solr:stop', 'solr:reindex', 'solr:start' 

我已經設置了IP爲其託管我的生產應用程序在sunspot.yml我的內部服務器:

production: 
    solr: 
    hostname: [My Server IP] 
    port: 8983 
    log_level: WARNING 
    # read_timeout: 2 
    # open_timeout: 0.5 

當我嘗試運行帽部署,出現以下錯誤:

* 2013-04-24 08:28:04 executing `solr:stop' 
    * executing "cd /home/username/apps/appname/current && RAILS_ENV=production bundle exec sunspot-solr stop --port=8983 --data-directory=/home/username/apps/appname/shared/solr/data --pid-dir=/home/datacomm/apps/appname/shared/pids" 
    servers: ["0.0.0.0"] 
    [0.0.0.0] executing command 
** [out :: 0.0.0.0] java version "1.7.0_15" 
** [out :: 0.0.0.0] 
** [out :: 0.0.0.0] OpenJDK Runtime Environment (IcedTea7 2.3.7) (7u15-2.3.7-0ubuntu1~12.04.1) 
** [out :: 0.0.0.0] 
** [out :: 0.0.0.0] OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode) 
** [out :: 0.0.0.0] 
** [out :: 0.0.0.0] **No PID file at /home/username/apps/appname/shared/pids/sunspot-solr.pid** 
** [out :: 0.0.0.0] 
    command finished in 990ms 
failed: "rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.3' -c 'cd /home/username/apps/appname/current && RAILS_ENV=production bundle exec sunspot-solr stop --port=8983 --data-directory=/home/username/apps/appname/shared/solr/data --pid-dir=/home/username/apps/appname/shared/pids'" on 0.0.0.0 

我錯過了什麼?任何幫助表示讚賞。

回答

3

run執行solr:stop任務提供的命令時,看起來您還沒有運行solr,因此它們沒有用於solr存在的pid文件。你試圖阻止一個不存在的過程。

如果從run返回的代碼是錯誤代碼,則Capistrano任務將拋出異常。您可以通過強制該命令永不返回錯誤來解決此問題。

作出這樣run命令看起來像這樣

run("YOUR COMMAND HERE > /dev/null 2>&1 || true") 

現在,如果你打電話solr:stop Solr的時候沒有運行,true將返回,讓Capistrano的繼續。

1

到Deefour的解決方案類似,一個更詳細的方法可能是在「開始/救援」語句包裹「運行」命令:

.... 
desc "start solr" 
task :start, :roles => :app, :except => { :no_release => true } do 
    begin 
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec sunspot-solr start --port=8983 --data-directory=#{shared_path}/solr/data --pid-dir=#{shared_path}/pids" 
    rescue Exception => error 
    puts "***Unable to start Solr with error: #{error}." 
    puts "***Continuing anyway.***" 
    end 
end 
...