【问题标题】:Unable to delete files with Cron无法使用 Cron 删除文件
【发布时间】:2023-03-09 17:43:01
【问题描述】:

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

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

关于为什么我的 root 的 cron 不会删除任何文件,我是否缺少一些非常简单的东西?系统日志显示它正在运行脚本或命令?

感谢您对此的任何帮助!

【问题讨论】:

  • 当您使用bash -x 时,您会收到包含脚本副本的电子邮件吗?
  • 你试过/usr/bin/find而不是find吗?
  • 我认为这是因为 cron 使用的是 sh,而不是 bash。将第一行 SHELL=/bin/sh 更改为 SHELL=/bin/bash。这有帮助吗?
  • @jsp 做到了!谢谢! (另外我不得不将 PATH 移到下一行。)
  • 使用find ... -exec rm {} + 通过一个rm 命令删除多个文件。或者更确切地说使用 find ... -delete 避免调用外部函数。

标签: bash shell cron find rm


【解决方案1】:

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

#! /bin/bash

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

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

env -i  myCronScript

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

【讨论】:

  • 您不必使用单独的文件,但如果您不使用绝对路径,cron 失败。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    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 目录

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多