无法将 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 版本。
我正在尝试将 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 版本。