[英]bash script runs from shell but not from cron job
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
short xargs选项是-r
如果目录中没有文件,则不会展开通配符并直接将其传递给命令。 没有名为“*”的文件,然后命令失败并显示“找不到文件或目录”。 试试这个:
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的+选项。
您是否在cronjob中指定了脚本的完整路径?
00 3 * * * /home/me/myscript.sh
而不是
00 3 * * * myscript.sh
另一方面,它是我可以访问的所有linux盒子上的/ bin / rm 。 您是否仔细检查过您的计算机上是否真的是/ usr / bin / rm ?
尝试添加
MAILTO=your@email.address
到你的cron文件的顶部,你应该收到邮件给你的任何输入/错误。
还可以考虑将命令添加为cronjob
0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
尝试使用强制选项,忘记添加rm命令的路径。 我认为不应该......
rm -f
这将确保即使目录中没有文件,rm命令也不会失败。 如果这是shell脚本的一部分,则*应该有效。 它看起来你可能有一个空的目录......
我知道脚本的其余部分正在执行,对吧?
rm
是否真的位于您系统上的/usr/bin/
? 我一直认为rm
应该驻留在/bin/
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.