为什么rake任务无法通过cron运行?

时间:2019-03-27 02:57:20

标签: ruby-on-rails ruby cron whenever

我已经定义了一个任务,使得用户运行rake background:fetch_image时可以按预期工作。如果我运行sudo -u www-data rake background:fetch_image,它也可以按预期工作。我不认为我将描述的错误是由我在任务本身中编写的代码引起的。

我正在使用何时 gem处理计划。设置一些变量以更正以前的错误后,何时在crontab中产生一行,如:

0 2 * * * /bin/bash -l -c 'cd /var/www/site && RAILS_ENV=production /usr/local/bin/bundle exec rake background:fetch_image --silent >> /var/www/site/log/whenever.log 2>&1'

cron执行此操作时出现此错误:

/usr/local/lib/ruby/2.6.0/pathname.rb:43:in `chop_basename': undefined method `match?' for /\A(?-mix:\/)?\z/:Regexp (NoMethodError)
Did you mean?  match
        from /usr/local/lib/ruby/2.6.0/pathname.rb:359:in `plus'
        from /usr/local/lib/ruby/2.6.0/pathname.rb:351:in `+'
        from /usr/local/lib/ruby/2.6.0/pathname.rb:188:in `parent'
        from /usr/local/lib/ruby/2.6.0/bundler/shared_helpers.rb:29:in `root'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:234:in `root'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:246:in `app_config_path'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:273:in `settings'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:84:in `configured_bundle_path'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:351:in `use_system_gems?'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:541:in `configure_gem_path'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:534:in `configure_gem_home_and_path'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:66:in `configure'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:134:in `definition'
        from /usr/local/lib/ruby/2.6.0/bundler.rb:101:in `setup'
        from /usr/local/lib/ruby/2.6.0/bundler/setup.rb:20:in `<top (required)>'
        from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
        from /usr/local/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'

仅当以这种方式通过cron运行任务时,才会发生此错误。 我尝试过包括扩展PATH变量并执行rbenv init的解决方案,但是都没有解决此问题。

为什么cron的行为方式如此不同以致导致此错误,并且该如何解决?

1 个答案:

答案 0 :(得分:1)

我最终更改了使用的PATH变量,以便使用/ usr / local / bin / ruby​​而不是/ usr / bin / ruby​​。我通过修改在int i = 0; int num = 0; //Empty String int primeNumber = 0; for (i = 1; i <= 100; i++) { int counter=0; for(num =i; num>=1; num--) { if(i%num==0) { counter = counter + 1; } } if (counter ==2) { primeNumber = i; } } System.out.println("Largest Prime number from 1 to 100 is : "); System.out.println(primeNumber); 中找到的{{3}}代码来做到这一点:

schedule.rb

这使cron和我的用户使用的版本一致。