Crontab日志条目添加换行:如何让rm -v输出每行单独记录?
解决crontab中rm日志挤在一行的问题
我明白你的困扰——明明加了-v参数,日志里的删除记录却挤成一团,可读性太差了。这里有几个简单的方法能帮你实现每条记录单独占一行:
方法1:用stdbuf强制行缓冲
问题的根源可能是输出到文件时用了块缓冲,导致所有输出攒到一起才写入。用stdbuf强制rm使用行缓冲,就能让每条删除记录实时换行:
0 3 * * * find $HOME/db_backups -name "db_name*.sql" -mtime +30 -exec stdbuf -oL rm -v {} \; >> $HOME/db_backups/purge.log 2>&1
-oL参数表示让标准输出使用行缓冲,这样每输出一行就会立刻写入日志文件。
方法2:用sh -c包裹命令手动添加换行
如果你的系统没有stdbuf,可以用shell命令来手动追加换行:
0 3 * * * find $HOME/db_backups -name "db_name*.sql" -mtime +30 -exec sh -c 'rm -v "$1"; echo' _ {} \; >> $HOME/db_backups/purge.log 2>&1
这里用sh -c执行两个命令:先删除文件并输出信息,再输出一个换行符,确保每条记录单独成行。
方法3:改用xargs代替-exec
xargs的处理方式也能让输出自然换行,而且效率比逐个-exec更高(不过对于备份文件来说差异不大):
0 3 * * * find $HOME/db_backups -name "db_name*.sql" -mtime +30 -print0 | xargs -0 rm -v >> $HOME/db_backups/purge.log 2>&1
-print0和-0是为了处理包含特殊字符的文件名,避免出错,同时rm -v的输出会自动每行一条记录。
你可以根据自己系统的情况选择其中一种方法,测试一下就能看到日志里的记录乖乖分开啦~
内容的提问来源于stack exchange,提问作者Quorong




