无法将 Ruby Sinatra 应用程序作为 systemd 单元启动 - gem 未找到

Can't start Ruby Sinatra App as systemd unit - gem not found

我正在尝试将 Sinatra 应用程序作为 Systemd 单元启动。 又不是第一次了,以前这个服务还可以,现在卡住了。

systemctl start service 总是抛出找不到 gem sinatra

这是日志:

Nov 27 19:52:45 cloud.onehostcloud.hosting ruby[29074]: /usr/local/rvm/rubies/ruby-2.5.7-devel/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- sinatra (LoadError)
Nov 27 19:52:45 cloud.onehostcloud.hosting ruby[29074]: from /usr/local/rvm/rubies/ruby-2.5.7-devel/lib/ruby/site_ruby/2.5.0/rubygems/core_ext/kernel_require.rb:54:in `require'
Nov 27 19:52:45 cloud.onehostcloud.hosting ruby[29074]: from /usr/lib/app/server.rb:34:in `<main>'
Nov 27 19:52:45 cloud.onehostcloud.hosting systemd[1]: app.service: main process exited, code=exited, status=1/FAILURE

app.service 文件:

[Unit]
Description=API Server Service

[Service]
Type=simple
Group=appuser
User=appuser
ExecStart=/usr/bin/ruby /usr/lib/app/server.rb
StartLimitInterval=30
StartLimitBurst=3
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

我已经检查 $: 是正确的,所以如果我尝试使用相同的路径,所有 gem 都可以通过 irb

找到并包含在内

使用 CentOS 7 和 RVM Ruby 2.5.7

谢谢!

您对 /usr/bin/ruby 的引用绕过了 RVM,听起来您正在使用 RVM 来管理您的 gem。

RVM 似乎没有关于如何设置 systemd 服务的文档,但它有 have guidance on launching scripts from cron,这是类似的情况。

基本上,RVM 为每个 ruby 版本和 gemset 的组合提供了一个包装器,您可以在 app.service 文件中使用它。您的 ExecService 行看起来像这样:

[Service]
ExecStart=/home/appuser/.rvm/wrappers/ruby-3.0.0@appgemset/ruby /usr/lib/app/server.rb

如果您还没有为您的应用程序创建特定的 gemset,那么您可以省略 @appgemset 部分,只指定您要使用的 ruby 版本。