ruby脚本cron不工作
我在~/scri.rb中有一个ruby脚本ruby脚本cron不工作,ruby,cron,ubuntu-14.04,Ruby,Cron,Ubuntu 14.04,我在~/scri.rb中有一个ruby脚本 File.open('~/newfile.txt', 'a+') do |f| f << "hi..\n" end 当我检查/var/log/syslog中的日志时,我看到如下条目 * * * * * bash -lc 'ruby ~/scri.rb' >> /var/log/syslog Sep 8 14:49:01 user1acer CRON[26063]: (user1) CMD (bash -lc 'ruby
File.open('~/newfile.txt', 'a+') do |f|
f << "hi..\n"
end
当我检查/var/log/syslog中的日志时,我看到如下条目
* * * * * bash -lc 'ruby ~/scri.rb' >> /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无关<代码>~是shell的一个特性,Ruby不知道它是什么。Ruby中只有一些方法处理
~
,例如File::expand\u 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+
]
请参阅(boldemphasis mine)的文档:
展开路径(文件名[,目录字符串])
→ <代码>abs文件名
将路径名转换为绝对路径名。除非给出了dir\u string
,否则从流程的当前工作目录引用相对路径,在这种情况下,它将用作起点给定路径名可以以“~”开头,扩展到进程所有者的主目录(必须正确设置环境变量home
)。“~user”扩展到命名用户的主目录
您需要在cron中使用完整路径。因此,不要写
~/newfile.txt
,而是写/home/your_user/newfile.txt
,以便cron知道文件的位置。事实上,您可能在/
中有这个文件,它是root的home dir.newfile.txt在home directory中。好的,我不熟悉Ruby。因此,如果您想打开该文件以附加内容,则需要告诉cron其完整路径。请使用/home/…
而不是前面所说的~
。通常,root的主目录是/root
,而不是/
。这里的关键是通过cron.Ah运行脚本时没有设置环境变量home。我甚至没有想到要调查那么远,因为OP的脚本在根本没有涉及cron的情况下已经收支平衡。从cron运行登录shell时也是这样吗?我以为登录shell的任务是设置$HOME
,而不是cron的。事实上我错了,只是在***echo“$HOME”>/tmp/myhome
中检查了它。真正的情况是env
包含的值比正常会话少得多。当然,~
不能被cron理解,因此必须给出一个有效的路径。我想。事实上,它可能被引用得“太多”,所以根本就没有被解释。哦,我多么喜欢处理多层次的字符串解释和引用。不