bash脚本从shell运行,但不是从cron作业运行

时间:2008-10-01 12:32:13

标签: linux bash cron

Cron安装是vixie-cron

/etc/cron.daily/rmspam.cron

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

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

我想为什么这不起作用,当然是一个有效的解决方案:)。

由于

编辑#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

5 个答案:

答案 0 :(得分: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 '{}' +

如果您有一个旧的查找,一次只执行一个文件:

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

处理太多文件以及没有文件。感谢Charles Duffy在find中指出-exec的+选项。

答案 1 :(得分:0)

您是否在cronjob中指定了脚本的完整路径?

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

而不是

00 3 * * * myscript.sh

另一方面,我可以访问的所有linux盒子上都是 / bin / rm 。您是否仔细检查过您的机器上是否真的 / usr / bin / rm

答案 2 :(得分:0)

尝试添加

MAILTO=your@email.address

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

另外考虑将命令添加为cronjob

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

答案 3 :(得分:0)

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

rm -f

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

我知道脚本的其余部分正在执行,对吧?

答案 4 :(得分:0)

rm真的位于您系统的/usr/bin/中吗?我一直认为rm应该位于/bin/