首页 > 解决方案 > 保持 Rails 服务器运行的 Cron 作业

问题描述

我正在尝试将以下行添加到 rails 应用程序的 crontab:

* * * * * lsof -i tcp | grep -v grep | grep -q puma || /home/me/app_name/bin/rails s

...简而言之,我有一个错误,偶尔会关闭我的 Rails 服务器,我想每分钟运行一次这个命令,以确保服务器尽可能保持可用。(实际错误是另一天的问题。)

最初,我收到一个错误:

shared_helpers.rb: 34 
in 'default_gemfile': could not locate Gemfile (Bundler::GemfileNotFound)

...追溯到 bin/rails 中的第 4 行:

load File.expand_path('../spring', __FILE__)

我将 ('../spring') 更改为 ('./spring'),因为 spring 脚本与 rails 脚本位于同一目录中,而不是在父级中。(奇怪的是,rails s无论我在路径中使用“..”还是“.”,从命令行运行都有效。)

这至少摆脱了上面的错误,但现在我有以下内容:

/bin/sh: 1: lsof: not found
/bin/sh: 1: grep: not found
/bin/sh: 1: grep: not found
/usr/bin/env: 'ruby_executable_hooks': No such file or directory

我每分钟收到一次这些错误,所以至少我知道我输入的时间格式是正确的。

我的 crontab 的相关部分如下所示:

PATH=$PATH:/usr/share/rvm/rubies/ruby-2.4.1/bin/
GEM_PATH=$GEM_PATH:/usr/share/rvm/gems/ruby- 
2.4.1:/usr/share/rvm/gems/ruby-2.4.1@global
* * * * * lsof -i tcp | grep -v grep | grep -q puma || /home/me/app/bin/rails s

我也试过:

* * * * * lsof -i tcp | grep -v grep | grep -q puma || /usr/share/rvm/gems/ruby-2.4.1/bin/rails s

...但得到同样的错误。

rails s正如我所提到的,我可以从命令行运行。我知道从登录的 shell 运行命令具有读取登录脚本和设置环境变量的好处,但我不知道我需要做什么才能让这个 crontab 中的环境协同工作。

注意:我没有whenever为此使用 gem,因为我使用的是外部命令,例如grepand lsof; 如果有一个等效的基于 rails 的解决方案(测试服务器是否正在运行,如果没有则启动它),我可以这样做而不是使用 crontab。(但我不知道那会是什么。)

标签: ruby-on-rails

解决方案


推荐阅读