Crontab没有运行ruby脚本

下面的crontab -l似乎没有运行。 手动运行的脚本运行正常。 这是我看到的错误

Dec 3 20:12:01 dahlia /USR/SBIN/CRON[13912]: (gigawatt) CMD (/bin/sh -c "(export PATH=/usr/bin:/bin; /home/gigawatt/drbronnersbot/drbronnersbot.rb)") Dec 3 20:12:01 dahlia /USR/SBIN/CRON[13910]: (CRON) error (grandchild #13912 failed with exit status 1) 

这是crontab:

 * * * * * /bin/sh -c "(export PATH=/usr/bin:/bin; /home/gigawatt/drbronnersbot/drbronnersbot.rb)" 

权限是完全打开的,它的可执行文件,我把env路径放在文件的开头,仍然没有骰子。

编辑 :我刚刚注意到用户回答了他自己的post,但我会留下这个,以防万一有人在这里遇到类似的问题。 我发现它对一些人有帮助。

我遇到过这个问题,发现这是Ruby脚本的解决方案。

Ruby需要在特定环境中执行。 RVM通过为特定版本的ruby提供ruby环境文件来处理这个问题,该文件设置了所有必需的环境变量。 例如,如果你有ruby 1.9.3补丁448,你可以查看源代码的环境文件:

 cat /usr/local/rvm/environments/ruby-1.9.3-p484 export PATH="/usr/local/rvm/gems/ruby-1.9.3-p484/bin:/usr/local/rvm/gems/ruby-1.9.3-p484@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p484/bin:$PATH" export GEM_HOME='/usr/local/rvm/gems/ruby-1.9.3-p484' export GEM_PATH='/usr/local/rvm/gems/ruby-1.9.3-p484:/usr/local/rvm/gems/ruby-1.9.3-p484@global' export IRBRC='/usr/local/rvm/rubies/ruby-1.9.3-p484/.irbrc' unset MAGLEV_HOME unset RBXOPT 

(注意:我的rvm安装在/usr/local/..但是你的安装可能在其他地方。使用which ruby来确定你的ruby的安装位置)

在这里你可以看到它正在设置PATH和一些其他重要的环境变量。 当你键入rvm use ruby-1.9.3-p448 ,rvm实际上在后台获取此文件。

Cron执行是非交互式会话,这意味着他们没有在会话前登录的“实时”用户。 当您手动执行并运行交互式会话时,所有这些都会为您完成,但对于非交互式会话,它不知道shell是什么或在何处查找环境路径。 也许有更多知识的人可以提供技术解释。

无论如何,要解决这个问题,请将其添加到crontab的顶部:

 SHELL=/bin/bash BASH_ENV=/home/gigawatt/.bashrc * * * * * /home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/gigawatt/drbronnersbot/drbronnersbot.rb 

这告诉非交互式cron用户使用哪个shell,然后告诉它来源.bashrc文件。 .bashrc文件中有什么? 好问题,你应该添加这一行 –

 source /usr/local/rvm/environments/ruby-1.9.3-p484 

(再次使用您自己的ruby路径替换)基本上您手动获取rvm为您提供的环境文件。 这是让cron使用特定gem环境或gemset的一种方式。

它应该适用于这两个变化。

我已经使用了它

* * * * * /bin/bash -l -c 'ruby my-ruby-file.rb'

解决了它,我在我的代码中调用了两个文件,但是找不到那些文件。 我编辑.rb文件以包含完整路径,它现在完美地工作。 感谢大家!

你有没有尝试过:

 * * * * * /home/gigawatt/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/gigawatt/drbronnersbot/drbronnersbot.rb 

这已经很老了,但我想我还是会发表评论。 RVM为您安装的每个ruby版本创建一个包装器。

运行此命令将2.5.1替换为ruby版本

 rvm env --path 2.5.1 

这给了你通往环境的道路

/home/username/.rvm/environments/2.5.1

你只想要rvm路径

/home/username/.rvm/

看一下wrappers目录,你应该为你安装的每个版本和gemset设置一个包装器。 使用包装器测试脚本

 /home/username/.rvm/wrappers/ruby-2.5.1/ruby /home/username/scripts/script.rb 

或者如果你有一个特定的gem集

 /home/username/.rvm/wrappers/ruby-2.5.1@gemset/ruby /home/username/scripts/script.rb 

直接在crontab中使用此命令

 * * * * * /home/username/.rvm/wrappers/ruby-2.5.1/ruby /home/username/scripts/script.rb