Bash 无法使用Cron删除文件

Bash 无法使用Cron删除文件,bash,shell,cron,find,rm,Bash,Shell,Cron,Find,Rm,几天来我一直在努力想办法解决这个问题。谷歌有很多答案,但似乎没有一个能解决这个问题。我希望其他人也有这个问题,并且知道如何解决它 所以问题是: 我想使用Cron删除超过3天的文件 我的Crontab: # m h dom mon dow command SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin */1 * * * * /roo

几天来我一直在努力想办法解决这个问题。谷歌有很多答案,但似乎没有一个能解决这个问题。我希望其他人也有这个问题,并且知道如何解决它

所以问题是: 我想使用Cron删除超过3天的文件

我的Crontab:

#       m       h       dom     mon     dow     command
SHELL=/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin
*/1     *       *       *       *       /root/insert.sh
0       0       *       *       *       /root/backup.sh
*/1     *       *       *       *       find /root/backups -mtime +3 -exec /bin/rm {} \;
有了这个Crontab
/root/backup.sh
可以在每晚午夜运行。而且
/root/insert.sh
(运行一个php脚本将一些数据移动到另一个文件夹)每分钟工作一次

我转到/root/backups并手动键入
find/root/backups-mtime+15-exec rm{}成功了。它删除了所有超过15天的文件

确认cron正在运行这行代码。我运行了
tail-f/var/log/syslog | grep CRON
(我运行的是ubuntu服务器13.04)

因此,您可以看到它正在运行。我试着在我的crontab中放置一个路径。我试着把
/bin/rm
代替
rm
。有人建议确保crontab的末尾有一个CR,它确实有

即使它是root的cron,我也做了
chmoda+rwx备份
,所以任何人都可以修改这个文件夹。还是没有运气

我在crontab中尝试了
rm-fr/root/backups
/bin/rm-fr/root/backups
,但没有成功。如果我执行了
/bin/rm-fr/root/backups>/root/logmeplease.log 2>&1
并且没有记录任何get

最后,我尝试将其放入shell脚本中

#!/bin/bash

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

find /root/backups -mtime +5 -exec /bin/rm {} \;
同样,文件底部有一个CR。此脚本通过手动运行来工作,但cron不会执行它。我也试过
#/bin/bash-l
#/bin/bash-x
位于顶部

有没有什么简单的东西我不知道为什么我的根的cron不会删除任何文件?系统日志显示它正在运行脚本或命令


谢谢你在这方面的帮助

为了更加健壮,您应该编写查找。。。在一个单独的脚本文件中。 e、 g

要测试脚本,请在没有环境的情况下运行它,即成为超级用户并启动

env -i  myCronScript

看看会发生什么。这些是cron运行脚本的条件。

cron默认使用sh,请检查该shell上的别名。 您可能会发现命令rm在使用sh shell时被迫请求promt:

root@server1]# env | grep  SHELL
SHELL=/bin/sh
[root@server1]# alias
...
alias rm='rm -i'

这就是为什么更改为bash可能会有所帮助,因为没有这种别名。

亲爱的Crontab默认使用sh shell而不是bash。 可以使用/dev/null清空文件。检查下面的脚本。这会有帮助的

#!/bin/bash
tar=$(ls -lt /backup/manual | grep ^d | tail -n1 | awk '{print $NF}')
for i in $(find /backup/manual/"$tar" -type f ) 
 do cat /dev/null > "$i" 
done > /dev/null 2>&1 && mv /backup/manual/"$tar" /tmp/

说明:请使用for loop来访问目标文件夹中的所有文件,并使其为空,最后移动到/tmp目录

当您使用
bash-x
时,您是否收到带有脚本副本的电子邮件?您是否尝试过
/usr/bin/find
而不是
find
?我认为这是因为cron使用的是sh,而不是bash。将第一行
SHELL=/bin/sh
更改为
SHELL=/bin/bash
。这有用吗?@jsp就是这样!谢谢(我还必须将路径向下移动到下一行。)使用
find-exec rm{}+
使用一个
rm
命令删除多个文件。或者使用
查找-删除可避免调用外部函数的
。您不必使用单独的文件,但如果不使用ablsolute路径,cron将失败。
root@server1]# env | grep  SHELL
SHELL=/bin/sh
[root@server1]# alias
...
alias rm='rm -i'
#!/bin/bash
tar=$(ls -lt /backup/manual | grep ^d | tail -n1 | awk '{print $NF}')
for i in $(find /backup/manual/"$tar" -type f ) 
 do cat /dev/null > "$i" 
done > /dev/null 2>&1 && mv /backup/manual/"$tar" /tmp/