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

时间:2020-03-06 14:58:25  来源:igfitidea点击:

Cron安装是vixie-cron

/ etc / cron.daily / rmspam.cron

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

我有这个简单的bash脚本,我想添加到cron作业中(之前也包含垃圾邮件学习命令),但是这部分总是失败,并显示"找不到文件或者目录"。作为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

解决方案

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

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

而不是

00 3 * * * myscript.sh

另一个需要注意的是,在我可以访问的所有Linux机器上都是/ bin / rm。我们是否仔细检查过它在计算机上确实是/ usr / bin / rm?

如果目录中没有文件,则通配符将不会展开,并将直接传递给命令。没有名为" *"的文件,然后命令失败,并显示"找不到文件或者目录"。尝试以下方法:

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的+选项。

尝试添加

[email protected]

到cron文件的顶部,我们应该将所有输入/错误发送给我们。

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

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

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

rm -f

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

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