2008-10-01 92 views
8

的Cron安装了vixie-cron的bash脚本从壳运行,而不是从cron作业

/etc/cron.daily/rmspam.cron

#!/bin/bash 
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*; 

我有我想要添加到cron作业这个简单的bash脚本(也包括垃圾邮件学习命令之前),但这部分总是失败,“文件或目录未找到”从我所看到的是,当作为cron作业运行时,metachar未被正确插入。如果我从命令行执行脚本,它工作正常。

我想一个为什么这不工作,当然是一个可行的解决方案:)

感谢

编辑#1 回来这个问题时,我得到普及问题徽章吧。我第一次这样做,

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm 

,最近刚通过xargs的手册页读,把它改成这个

#!/bin/bash 
find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm 

短xargs的选项是-r

+0

请编辑并添加你的crontab中的行。 – 2008-10-01 12:38:33

+0

他在下面的评论中提到它位于/etc/cron.daily – 2008-10-01 12:42:14

回答

14

如果目录中没有文件,则通配符将不会被展开并直接传递给命令。没有名为“*”的文件,然后命令失败,并显示“未找到文件或目录”。试试这个:

if [ -f /home/user/Maildir/.SPAM/cur/* ]; then 
    rm /home/user/Maildir/.SPAM/cur/* 
fi 

或者只是使用“-f”标志rm。该命令的另一个问题是当命令行的最大长度存在太多垃圾邮件时发生的情况。像这样的东西可能是更好的整体:

find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' + 

如果你有一个旧的发现只有高层RM一个文件上的时间:

find /home/user/Maildir/.SPAM/cur -type f | xargs rm 

,处理过多的文件以及任何文件。感谢Charles Duffy指出+选项在find中执行。

0

你指定的完整路径到cronjob中的脚本?

00 3 * * * /home/me/myscript.sh 

而不是

00 3 * * * myscript.sh 

在另一方面,这是对所有的Linux机器我有机会获得/斌/ RM。你有没有在你的机器上仔细检查它确实是/usr/bin/rm

+0

该脚本位于/etc/cron.daily/,它位于/ etc/crontab – Tanj 2008-10-01 12:34:59

0

尝试添加

[email protected] 

到你的cron文件的顶部,你应该得到邮寄给您的任何输入/错误。

也可以考虑添加命令作为一个cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/* 
0

尝试使用强制选项,而忘记了添加路径rm命令。我认为它不应该需要...

rm -f 

这将确保即使目录中没有文件,rm命令也不会失败。如果这是一个shell脚本的一部分,*应该工作。它在我看来你可能有一个空的目录...

我明白脚本的其余部分正在执行,对不对?

0

rm确实位于您的系统上的/usr/bin/?我一直认为rm应该居住在/bin/