Rails,Sidekiq和systemd都在debian 8上

dis*_*rly 5 debian ruby-on-rails sidekiq systemd

情况:我有一个rails应用程序,sidekiq,工作得很好,在debian8下.

我希望更容易控制我的sidekiq,所以不是使用-d选项守护它,而是想创建一个sidekiq.service文件/etc/systemd/system/sidekiq.service.(所以我能够sudo systemctl restart sidekiq.service)

我在github上看到了gitlab是怎么做的,但它对我不起作用,因为我使用rvm来安装ruby.

如果我对/ path/to/rvm/bin/bundle做同样的事情,它会返回一个错误"无法找到Gemfile".(我之前也跑了gem install bundler)

我可以从另一个目录启动sidekiq,而不是我的rails应用程序: BUNDLE_GEMFILE=/home/me/myapp/Gemfile bundle exec sidekiq --config /home/me/myapp/config/sidekiq.yml --require /home/me/myapp/config/environment.rb

但是在ExecStart行的/etc/systemd/system/sidekiq.service中,我有一个错误: Executable path is not absolute

关于我怎么做的任何线索?

或者,在docker容器中运行sidekiq可能会更高效/更简单吗?

ris*_*isa 5

我刚刚在Ubuntu 15.04上尝试使用systemd.(这也适用于Ubuntu 14.x上的Upstart.)我使用RVM的alias命令作为bundle的绝对路径.我认为它也有助于告诉它一开始就在哪个目录中.

制作RVM包装器/别名.从Rails目录:

rvm current                      # grab gemset name
rvm alias create NAME GEMSET_NAME
Run Code Online (Sandbox Code Playgroud)

所以,如果您的宝石集名称是ruby-2.2.2@awesome_app,并且您希望您的包装器/别名被称为'awesome_app',那么它将是:

rvm alias create awesome_app ruby-2.2.2@awesome_app
Run Code Online (Sandbox Code Playgroud)

然后在systemd中,完整路径类似于PATH=/usr/local/rvm/wrappers/awesome_app/使得ExecStart命令:

ExecStart=/usr/local/rvm/wrappers/awesome_app/bundle exec sidekiq ...
Run Code Online (Sandbox Code Playgroud)

编辑:我已经确认我的sidekiq工作人员现在正常工作.这是我的完整sidekiq.service文件.

Description=Sidekiq Background Worker

[Service]
Type=forking
User=rails
Group=rails
WorkingDirectory=/home/deployer/app
Environment=RAILS_ENV=production
GuessMainPID=true
ExecStart=/usr/local/rvm/wrappers/awesome_app/bundle exec "sidekiq -d -L log/sidekiq.log -q mailer,5 -q default -e production  >> log/sidekiq.log 2>&1"
ExecStop=/usr/local/rvm/wrappers/awesome_app/bundle exec "sidekiqctl stop /home/deployer/app/tmp/pids/sidekiq.pid >> /home/deployer/app/log/sidekiq.log 2>&1"

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

目前我用monit监控了它.我个人更喜欢Upstart,因为systemd每个都需要密码.单.时间.但是,就像我说的那样,可以证实这对我有用.