4

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

所以问题是:我想使用 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 server 13.04)

Jul 24 07:47:01 myServer CRON[13934]: (root) CMD (find /root/backups -mtime +3 -exec rm {} \;)
Jul 24 07:48:01 myServer CRON[13937]: (root) CMD (/root/insert.sh)
Jul 24 07:48:01 myServer CRON[13938]: (root) CMD (find /root/backups -mtime +3 -exec rm {} \;)
Jul 24 07:49:01 myServer CRON[13954]: (root) CMD (/root/insert.sh)
Jul 24 07:49:01 myServer CRON[13955]: (root) CMD (find /root/backups -mtime +3 -exec /bin/rm {} \;)

所以你可以看到它正在运行。我已经尝试在我的 crontab 中放置一个 PATH 。我试过把/bin/rm而不是rm. 有人建议确保 crontab 的末尾有一个 CR。确实如此。

即使它是 root 的 cron,我也这样做了chmod a+rwx backups,所以任何人都可以修改这个文件夹。那里仍然没有运气。

我已经在我的 crontab 中尝试过rm -fr /root/backups/bin/rm -fr /root/backups但没有奏效。如果我这样做/bin/rm -fr /root/backups >> /root/logmeplease.log 2>&1并且没有任何记录。

最后,我尝试将其放入 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 不会删除任何文件,我是否缺少一些非常简单的东西?系统日志显示它正在运行脚本或命令?

感谢您对此的任何帮助!

4

3 回答 3

2

为了更健壮,您应该将 find ... 编写在单独的脚本文件中。例如

#! /bin/bash

/usr/bin/find .... -delete \;

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

env -i  myCronScript

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

于 2013-07-25T11:23:44.650 回答
1

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

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

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

于 2018-03-07T09:50:50.520 回答
0

Dear 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 循环访问目标文件夹中的所有文件并将它们设为 null 并最后移动到 /tmp 目录

于 2020-09-27T17:03:35.720 回答