Bash 无法使用Cron删除文件
几天来我一直在努力想办法解决这个问题。谷歌有很多答案,但似乎没有一个能解决这个问题。我希望其他人也有这个问题,并且知道如何解决它 所以问题是: 我想使用Cron删除超过3天的文件 我的Crontab: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
# 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/