我使用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/
中找不到任何相关日志。
答案 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定义