【问题标题】:ruby script cron not working红宝石脚本cron不工作
【发布时间】:2016-09-08 09:24:25
【问题描述】:

我在 ~/scri.rb 中有一个 ruby​​ 脚本

File.open('~/newfile.txt', 'a+') do |f|
  f << "hi..\n"
end

我有一个这样的 cron 选项卡

* * * * * bash -lc 'ruby ~/scri.rb' >> /var/log/syslog

当我检查 /var/log/syslog 中的日志时,我看到这样的条目

Sep  8 14:49:01 user1acer CRON[26063]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog)
Sep  8 14:50:01 user1acer CRON[27502]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog)
Sep  8 14:51:01 user1acer CRON[29006]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog)
Sep  8 14:52:01 user1acer CRON[30425]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog)
Sep  8 14:53:01 user1acer CRON[31846]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog)

但是当我检查 newfile.txt 文件时,我什么也没看到。

我在这里错过了什么吗?

【问题讨论】:

  • 您需要在 cron 中使用完整路径。所以不要写~/newfile.txt,而是写/home/your_user/newfile.txt,这样cron就知道在哪里找到文件。实际上,您可能在 / 中拥有该文件,这是 root 的主目录。
  • newfile.txt 在主目录中。
  • 好吧,我对 Ruby 不熟悉。所以如果你想打开那个文件来追加内容,你需要告诉 cron 它的完整路径。如前所述,尝试使用/home/... 而不是~
  • 通常,root 的主目录是/root,而不是/

标签: ruby cron ubuntu-14.04


【解决方案1】:

实际上,这与 cron 无关。 ~ 是shell 的一个特性,Ruby 不知道它是什么。 Ruby 中只有 一些 方法处理 ~,例如File::expand_path。因此,Ruby 实际上是在尝试在当前工作目录中名为 ~ 的目录中打开一个名为 newfile.txt 的文件。自己试试吧:在你的主目录下创建一个名为~的空目录,果然,1分钟后,你应该会在其中找到一个名为newfile.txt的新文件,内容为hi..

有几种方法可以解决此问题,我将由您决定使用哪一种:

File.open(File.expand_path('~/newfile.txt'), 'a') do |f| end
File.open(File.join(Dir.home, 'newfile.txt'), 'a') do |f| end

[注意:如果你只想追加到文件末尾,而不是移动或读取,a就足够了,你不需要a+。]

请参阅File::expand_path 的文档(粗体强调我的):

expand_path(file_name [, dir_string] )abs_file_name

将路径名转换为绝对路径名。除非给出dir_string,否则从进程的当前工作目录引用相对路径,在这种情况下,它将用作起点。 给定的路径名​​可能以“~”开头,扩展为进程所有者的主目录(必须正确设置环境变量HOME)。 “~user”展开到指定用户的主目录。

【讨论】:

  • 这里的关键是通过cron运行脚本时没有设置环境变量HOME。
  • 啊。我什至没有想过要调查那么远,因为即使 没有 涉及 cron,OP 的脚本也已经被破坏了。从 cron 运行登录 shell 时也是如此吗?我认为设置$HOME 是登录shell 的工作,而不是cron 的。
  • 其实我错了,只是检查了一下* * * * * echo "$HOME" &gt; /tmp/myhome。事实是,env 包含的值比正常会话少得多。当然,~ 不被 cron 理解,所以必须给出一个有效的路径。
  • 好吧,~ 被引用了,所以它不是由 cron 而是由 bash 解释的。我认为。它实际上可能被“过多”引用,因此根本不会被解释。哦,我多么喜欢处理多层次的字符串解释和引用。不是。
猜你喜欢
  • 2017-09-02
  • 2015-03-31
  • 2015-10-21
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多