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脚本的一部分,则*应该起作用。在我看来,我们可能有一个空目录...
我知道脚本的其余部分正在执行,对吗?