使用 Capistrano 启动后台任务

发布于 2024-07-26 13:10:05 字数 560 浏览 6 评论 0原文

对于我的 RubyOnRails-App,我必须在 Capistrano 部署结束时启动后台作业。 为此,我在deploy.rb中尝试了以下操作:

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true

有时这有效,但大多数时候它不会启动该进程(=未在ps -aux中列出)。 并且没有错误消息。 并且没有nohup.out,不在主目录中,也不在rails app目录中。

我尝试在scheduler.rb中使用trap('SIGHUP', 'IGNORE')代替nohup,但结果是相同的。

让它工作的唯一方法是删除“:pty => true”并在“cap部署”末尾执行手动Ctrl-C。 但我不喜欢这个...

还有其他机会调用这个 Scheduler.start 吗? 或者获取更多错误消息?

我在服务器上使用 Rails 2.3.2、Capistrano 2.5.8、Ubuntu Hardy

For my RubyOnRails-App I have to start a background job at the end of Capistrano deployment. For this, I tried the following in deploy.rb:

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true

Sometimes this works, but most of the time it does not start the process (= not listed in ps -aux). And there are no error messages. And there is no nohup.out, not in the home directory and not in the rails app directory.

I tried using trap('SIGHUP', 'IGNORE') in scheduler.rb instead of nohup, but the result is the same.

The only way to get it work is removing the ":pty => true" and do a manual Ctrl-C at the end of "cap deploy". But I don't like this...

Are there any other chances to invoke this Scheduler.start? Or to get some more error messages?

I'm using Rails 2.3.2, Capistrano 2.5.8, Ubuntu Hardy on the Server

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

不必了 2024-08-02 13:10:05

与 :pty => 是的,用户 shell 启动脚本(例如 bashrc 等)(通常)不会被加载。 由于缺少依赖的环境变量,我的 ruby​​ 程序在启动后立即退出。

没有 :pty => 是的,正如您在问题中所描述的,capistrano 挂在那里等待进程退出。 您需要重定向 stdout 和 stderr 以使其立即返回。

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good.

如果您的后台任务仍然没有运行。 尝试将 stdout 和 stderr 重定向到日志文件,以便您可以调查输出。

With :pty => true, user shell start-up scripts (e.g. bashrc, etc.) are (usually) not loaded. My ruby program exited right after launching because of the lack of dependent environment variables.

Without :pty => true, as you described in the question, capistrano hangs there waiting for the process to exit. You'll need to redirect both stdout and stderr to make it return immediately.

run 'nohup ruby -e "sleep 5" &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null &' # hangs for 5 seconds
run 'nohup ruby -e "sleep 5" > /dev/null 2>&1 &' # returns immediately. good.

If your background task still doesn't run. Try redirecting stdout and stderr to a log file so that you can investigate the output.

誰認得朕 2024-08-02 13:10:05

我想分享我的解决方案,该解决方案在执行多个命令时也有效。 我尝试了在网上找到的许多其他变体,包括“sleep N”黑客。

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true)

这是一个重复响应 在 capistrano 任务中启动后台进程,但想要确保其他人和我自己可以通过谷歌搜索到这个解决方案。

I'd like to share my solution which also works when executing multiple commands. I tried many other variants found online, including the "sleep N" hack.

run("nohup sh -c 'cd #{release_path} && bundle exec rake task_namespace:task_name RAILS_ENV=production > ~/shared/log/<rakelog>.log &' > /dev/null 2>&1", :pty => true)

This is a dup response launching background process in capistrano task but want to make sure others and myself can google for this solution.

爱她像谁 2024-08-02 13:10:05

您是否希望调度程序作业在后台持续运行并在运行 Capistrano 时重新启动?

如果是这样,那么我使用 runit http://smarden.sunsite.dk/runit/和 DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. 安装runit 以不替换 init 的方式
  2. 将您的后台作业添加为 runit 服务,并从 runit 为其添加日志监视器。
  3. 让 Capistrano 调用 sudo sv Kill job_name 来终止并重新启动作业。

我的后台作业是 Rails 插件 DelayedJob 的一个实例,它处理后台 Rails 任务。 我在每次 Capistrano 部署时都会杀死它,这样它将使用更新的代码库重新启动。

事实证明这是非常可靠的。

HTH,

拉里

Do you want your Scheduler job to run continually in the background and get restarted when you run Capistrano?

If so, then for that I use runit http://smarden.sunsite.dk/runit/ and DelayedJob http://github.com/Shopify/delayed_job/tree/master

  1. Install runit in the mode of not replacing init
  2. Add your background job as a runit service and add the log monitor for it from runit.
  3. Have Capistrano call sudo sv kill job_name to kill and restart the job.

My backround job is an instance of the Rails plugin DelayedJob which handles background Rails tasks. I kill it with every Capistrano deploy so it will restart with the updated code base.

This has proved to be very reliable.

HTH,

Larry

枯寂 2024-08-02 13:10:05

如果这个任务调度程序有一个 -d 开关,它就会工作。 例如,乘客独立程序有一个 -d 选项将其作为妖魔化进程启动。

namespace :passenger_standalone do
  task :start do
    run "cd #{current_path} && passenger start -e #{rails_env} -d"
  end
  task :stop do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop"
  end
  task :restart do
    stop
    start
  end
end

If this task scheduler has a -d switch it will work. For example passenger standalone has a -d option to start it as a demonized process.

namespace :passenger_standalone do
  task :start do
    run "cd #{current_path} && passenger start -e #{rails_env} -d"
  end
  task :stop do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} passenger stop"
  end
  task :restart do
    stop
    start
  end
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文