使用Capistrano开始后台任务

Geo*_*ann 19 background capistrano ruby-on-rails nohup

对于我的RubyOnRails-App,我必须在Capistrano部署结束时开始后台工作.为此,我在deploy.rb中尝试了以下内容:

run "nohup #{current_path}/script/runner -e production 'Scheduler.start' &", :pty => true
Run Code Online (Sandbox Code Playgroud)

有时它可以工作,但大多数情况下它不会启动过程(=未在ps -aux中列出).并且没有错误消息.没有nohup.out,不在主目录中,也不在rails app目录中.

我尝试在scheduler.rb而不是nohup中使用trap('SIGHUP','IGNORE'),但结果是一样的.

让它工作的唯一方法是删除":pty => true"并在"cap deploy"结束时执行手动Ctrl-C.但我不喜欢这个......

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

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

Arr*_*rix 17

使用:pty => true,(通常)不加载用户shell启动脚本(例如bashrc等).由于缺乏依赖的环境变量,我的ruby程序在启动后立即退出.

如果没有:pty => true,正如你在问题中描述的那样,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.
Run Code Online (Sandbox Code Playgroud)

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

  • 我为同样的问题苦苦挣扎了一整天。按照建议重定向输出解决了问题。 (3认同)

oko*_*kor 6

我想分享我的解决方案,该解决方案在执行多个命令时也有效.我在网上尝试了许多其他变种,包括"睡眠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)
Run Code Online (Sandbox Code Playgroud)

这是在capistrano任务中启动后台进程的重复响应,但是想确保其他人和我自己可以谷歌寻求此解决方案.


Lar*_*y K 1

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

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

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

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

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

哈特哈,

拉里