工头生成的Upstart任务找不到文件?

时间:2014-08-06 11:56:16

标签: ruby-on-rails upstart foreman

我使用foreman将我的Procfile导出到upstart任务。

Procfile:

web: bundle exec rails server
websocket: bundle exec rails runner websocket-server/em_websocket.rb

其中一项新贵任务(它们非常相似,但失败并出现同样的错误):

start on starting app-web
stop on stopping app-web
respawn

env PORT=5000

setuid app

chdir /var/www/app

exec bundle exec rails server

错误(我是通过dmesg得到的):

[35207.676836] init: Failed to spawn app-websocket-1 main process: unable to execute: No such file or directory
[35207.679577] init: Failed to spawn app-web-1 main process: unable to execute: No such file or directory

当我切换到app用户时,我实际上可以从给定目录运行bundle exec rails server

有没有办法将误差再确定一点?我在/var/log/upstart/中找不到任何相关日志。

3 个答案:

答案 0 :(得分:5)

如果您通过RVM安装了ruby,则可能在rvm脚本运行之前运行init。您是否尝试使用捆绑包的绝对引用?

whereis bundle 

获得它

RVM显然没有初始化或在新兴环境中无法使用。幸运的是rvm有这个案例的包装:https://rvm.io/integration/init-d

答案 1 :(得分:1)

您可以用其他方式运行bundle。 而不是:

web: bundle exec rails server

您需要运行:

web: bash -c '~/.rvm/bin/rvm default do bundle exec rails server'

注意:〜/ .rvm / bin / rvm - 可以替换为服务器上rvm安装的实际路径。

答案 2 :(得分:-2)

Upstart命令需要底层用户的sudo权限。您是否考虑为应用程序用户定义某种形式的无密码sudo权限以运行rails应用程序服务重新启动?

例如在Ubuntu中在/etc/sudoers.d /下创建一个新的sudoer定义?

username ALL=(ALL) NOPASSWD:ALL

一旦定义'用户名'应该能够通过sudo service'appname'stop | start | restart运行rails app。

以下是向用户提供sudo权限的说明。我的Capistrano部署包含一个foreman导出定义,如下所示 -

namespace :foreman do
 desc 'Export the Procfile to Ubuntu upstart scripts'
 task :export do
   on roles(:app) do |host|
    log_path = shared_path.join('log')
    within release_path do
      execute :mv, ".env .envbkup"
      execute :echo, "'RACK_ENV=#{fetch(:deploy_env)}' >> .env"
      execute :echo, "'RAILS_ENV=#{fetch(:deploy_env)}' >> .env"
      execute :bundle, "exec foreman export upstart #{shared_path}/init -a #{fetch(:application)} -u #{host.user} -l #{log_path}"
      execute :rm, ".env"
      execute :mv, ".envbkup .env"
      as :root do
        execute :cp, "#{shared_path}/init/* /etc/init/"
      end
  end
 end
end

在'action。

之后,从deploy_env.rb'调用此capistrano定义