我正在尝试将以下行添加到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,因为我正在使用grep
和lsof
之类的外部命令;如果有一个等效的基于Rails的解决方案(以测试服务器是否正在运行,如果服务器未运行,则启动它),我可以这样做,而不是使用crontab。 (但我不知道那会是什么。)