【问题标题】:how to run a script on rails server using capistrano?如何使用 capistrano 在 Rails 服务器上运行脚本?
【发布时间】:2013-01-15 11:39:06
【问题描述】:

我使用 gem "mailman" 编写了一个名为 mailman_server 的脚本,该脚本位于“script/mailman_server”中

    #!/usr/bin/env ruby
    require "rubygems"
    require "bundler/setup"
    require "mailman"

    #Mailman.config.logger = Logger.new("log/mailman.log")
    Mailman.config.poll_interval = 3
    Mailman.config.pop3 = {
      server: 'server', port: 110,
      username: "loginid",
      password: "password"
    }

    Mailman::Application.run do
      default do
        p "Found a new message"
        # 'perform some action here'
        end
    end

它从我的帐户中获取所有电子邮件,然后我对它们进行处理。

我有我的deploy.rb 文件

set :stages, %w(production)     #various environments
load "deploy/assets"                    #precompile all the css, js and images... before deployment..
require "bundler/capistrano"            # install all the new missing plugins...
require 'delayed/recipes'               # load this for delayed job..
require 'capistrano/ext/multistage'     # deploy on all the servers..
require "rvm/capistrano"                # if you are using rvm on your server..
require './config/boot'           
require 'airbrake/capistrano'           # using airbrake in your application for crash notifications..

set :delayed_job_args, "-n 2"            # number of delayed job workers 


before "deploy:assets:symlink", "deploy:copy_database_file"
before "deploy:update_code",  "delayed_job:stop"  # stop the previous deployed job workers...
after "deploy:start",   "delayed_job:start" #start the delayed job 
after "deploy:restart", "delayed_job:restart" # restart it..
after "deploy:update", "deploy:cleanup" #clean up temp files etc.
set :rvm_ruby_string, '1.9.3'             # ruby version you are using...
set :rvm_type, :user

server "my_server_ip", :app, :web, :db, :primary => true 

set(:application) { "my_application_name" }
set (:deploy_to) { "/home/user/#{application}/#{stage}" }
set :user, 'user'
set :keep_releases, 3
set :repository, "git@bitbucket.org:my_random_git_repo_url"
set :use_sudo, false
set :scm, :git
default_run_options[:pty] = true
ssh_options[:forward_agent] = true
set :deploy_via, :remote_cache
set :git_shallow_clone, 1
set :git_enable_submodules, 1

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
  task :copy_database_file do
    run "ln -sf #{shared_path}/database.yml #{release_path}/config/database.yml"
  end
end

我想在每次部署到服务器时执行这个脚本。此外,每当我部署代码时,我都需要停止此脚本。

我无法弄清楚如何在服务器上使用 capistrano 启动或停止此脚本。

【问题讨论】:

  • 如何手动停止脚本?只需在处理过程中按 Ctrl+C 即可?如果是这种情况,最好添加另一个脚本来终止由mailman_server 启动的进程,并从before deploy 回调中调用它。
  • @Prakash 是的,我这样做。因为我需要在服务器上运行该脚本,所以我使用了屏幕。

标签: deployment ruby-on-rails-3.2 capistrano


【解决方案1】:

您可以尝试在开始时保存进程的 pid

run "cd #{deploy_to}/current; ./script/mailman_server &; echo &! > /var/run/mailman_server.pid" #untested

并用

停止它
run "kill `cat /var/run/mailman_server.pid`;  rm /var/run/mailman_server.pid"

但我认为您应该查看Foreman,它提供了在开发中运行作业的便捷方式,并支持将您的作业导出到新贵或 inid.d 脚本以进行生产,因此您只需启动或停止相应的服务

run "sudo /etc/init.d/mailman_server start"
run "sudo /etc/init.d/mailman_server stop"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多