【问题标题】:每天使用 cron 任务清空日志文件
【发布时间】:2022-01-23 16:20:28
【问题描述】:

我想每天在特定时间清空(而不是删除)日志文件。像

echo "" > /home/user/dir/log/*.log

但它会返回

-bash: /home/user/dir/log/*.log: ambiguous redirect

有什么办法可以做到吗?

【问题讨论】:

    标签: linux ubuntu cron


    【解决方案1】:

    您不能重定向到多个文件,但您可以tee 重定向到多个文件。

    tee /home/user/dir/log/*.log </dev/null
    

    来自/dev/null 的重定向也避免了在每个文件的开头写入一个空行,这是您尝试中的另一个错误。 (如果通配符与任何现有文件都不匹配,也许可以指定 nullglob 以避免创建名称为 *.log 的文件。)

    但是,更好的解决方案可能是使用实用程序logrotate,它在每个 Debian(以及 Ubuntu、Mint 等)安装中开箱即用。它默认每晚运行,并且可以通过在其配置目录中放置一个文件来进行配置。它可以让您压缩以前版本的日志文件而不是仅仅覆盖,并注意保留所有权和权限等。

    【讨论】:

    • 两种方法都按预期工作。感谢您向我介绍 logrotate 工具
    【解决方案2】:

    你可以试试这个。
    使用 For 循环删除并重新创建这些文件。
    创建 .sh 文件 ( something.sh ) 并在其中添加以下代码。

    
    #!/bin/bash
    
    for f in /home/user/dir/log/*.log
    do
       [ -f "$f" ] && rm "$f"
       touch "$f"
    done
    
    #change permision
    chown -R root:root /home/user/dir/log/
    
    

    每晚在 cron 中运行

    * 22 * * * /file path/something.sh
    

    【讨论】:

    • 这将破坏对日志文件通常很重要的所有权和权限。此外,切线地,.sh 扩展名通常不应用于 Bash 脚本。事实上,大多数脚本文件根本不应该有扩展名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多