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重定向到日志文件,以便您可以调查输出.
我想分享我的解决方案,该解决方案在执行多个命令时也有效.我在网上尝试了许多其他变种,包括"睡眠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任务中启动后台进程的重复响应,但是想确保其他人和我自己可以谷歌寻求此解决方案.
您是否希望调度程序作业在后台持续运行并在运行 Capistrano 时重新启动?
如果是这样,那么我使用 runit http://smarden.sunsite.dk/runit/和 DelayedJob http://github.com/Shopify/delayed_job/tree/master
我的后台作业是 Rails 插件 DelayedJob 的一个实例,它处理后台 Rails 任务。我在每次 Capistrano 部署时都会杀死它,这样它将使用更新的代码库重新启动。
事实证明这是非常可靠的。
哈特哈,
拉里
| 归档时间: |
|
| 查看次数: |
7341 次 |
| 最近记录: |