8

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

4

5 回答 5

14

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

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

或者只是对 rm 使用“-f”标志。此命令的另一个问题是当命令行的最大长度有太多垃圾邮件时会发生什么。这样的事情总体上可能更好:

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

如果您有一个旧的 find 一次只执行 rm 一个文件:

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

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

于 2008-10-01T12:38:11.927 回答
0

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

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

而不是

00 3 * * * myscript.sh

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

于 2008-10-01T12:33:48.487 回答
0

尝试添加

MAILTO=your@email.address

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

还可以考虑将命令添加为 cronjob

0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
于 2008-10-01T12:41:29.607 回答
0

尝试使用 force 选项,忘记添加 rm 命令的路径。我觉得应该不需要...

rm -f

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

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

于 2008-10-01T12:42:52.163 回答
0

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

于 2011-01-18T12:19:56.670 回答