AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 742704
Accepted
TommyPeanuts
TommyPeanuts
Asked: 2015-12-14 01:05:36 +0800 CST2015-12-14 01:05:36 +0800 CST 2015-12-14 01:05:36 +0800 CST

find -delete 工作正常,但不适用于 cron

  • 772

请注意:我已经阅读了所有类似的问题。cron、路径、环境变量等,但没有找到可以解决我的特定问题的方法。


我有一个脚本可以进行一些 MySQL 转储,然后像这样删除旧的转储:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete

(上面的命令已根据评论的建议从我原来的命令中修改)

但是,当 cron 运行此脚本时,这些文件永远不会被删除。cron 用户是 root。

调试说明

  • 如果我手动运行出现命令的脚本,它会按预期删除它们。

  • 如果我以 root 身份从命令行自行运行上述 find 命令,它会按预期删除它们(并且使用 -print 它会按预期返回超过 5 天的文件列表)

  • 我还在 root 的 crontab 中添加了一个显式路径语句,但这
    并没有改变任何东西。

  • Cron 不发送错误,如果我将查找操作通过管道传输到日志文件,
    则该文件为空或根本没有创建。

  • 我正在使用 Ubuntu 服务器 14.04.03 LTS。

cron
  • 4 4 个回答
  • 14179 Views

4 个回答

  • Voted
  1. Will
    2015-12-14T22:13:03+08:002015-12-14T22:13:03+08:00

    问题是它运行时crontab没有设置。$PATH您实际上可以通过将其添加到通过以下方式打开的文件的顶部来为其提供路径crontab -e:

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

    (或任何PATH你喜欢使用的东西)。这意味着您可以避免直接从 cron 指定命令的完整路径。

    您的原始命令存在多个问题。您基本上是在要求 shell 进行通配符扩展,而不是find. 其次,您没有为rm;提供完整的路径。使用/bin/rmor /usr/bin/rm,它位于系统上的任何位置(请参阅 参考资料which rm)。

    find 的第一个参数是“要搜索的位置”,然后使用各种-<option>s 指定“搜索查询”。因此,您要运行的命令的正确格式是:

    find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \;
    

    或者

    find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
    

    如果您没有PATH像上面那样指定定义,请使用:

    /usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \;
    

    或者

    /usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete
    
    • 6
  2. shad0VV
    2015-12-14T01:13:14+08:002015-12-14T01:13:14+08:00

    试试这个

    find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete
    
    • 3
  3. Best Answer
    TommyPeanuts
    2015-12-24T01:37:27+08:002015-12-24T01:37:27+08:00

    如果我直接从 root 的 crontab 调用 find 命令,而不是作为脚本的一部分,那么它可以工作。

    有问题的脚本使用 csh。我相信 Ubuntu 上 root 的 cron 环境将使用 /bin/bash(或 /bin/dash?)。也许这在某种程度上与 find 命令的运行方式有冲突。

    无论哪种方式,它都解决了主要问题,尽管有些不雅。

    • 0
  4. linux.cnf
    2020-09-28T09:10:49+08:002020-09-28T09:10:49+08:00

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

    • -2

相关问题

  • 每 4 小时运行一次 cron 的正确语法是什么?[复制]

  • 用于 mysql 数据库清理和备份的 crontab

  • Windows cron 作业

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • crontab ifconfig 什么都不输出

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve