我的干净的码头日志脚本如下(CentOS 7):
#!/usr/bin/env bash
set -uex
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done
logsrm=$(find /var/lib/docker/ -mtime +7 -name *.log -type f)
for logm in $logsrm
do
echo "delete logs : $logm"
cat /dev/null > $logm
done
echo "======== end clean docker containers logs ========"当我使用crontab执行它时:
*/1 * * * * root /data/scripts/docker-clean.sh >> $HOME/cron.log 2>&1输出日志如下:
[root@uat-k8s-01 ~]# tail -f cron.log
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=
+ echo '======== start clean docker containers logs ========'
======== start clean docker containers logs ========
++ find /var/lib/docker/ -type f -name cron.log cront.log -size +25M
find: paths must precede expression: cront.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
+ logs=我该怎么做才能让它正常工作?
发布于 2020-04-19 08:36:25
正如我在对你之前的问题的答复中提到的,在调用find之前,必须引用模式*.log来阻止D2将模式扩展为当前目录中的名称。
除此之外,不要循环find的输出(参见"为什么循环查找的输出错误的做法?")。
在您的例子中,循环
logs=$(find /var/lib/docker/ -type f -name *.log -size +25M)
for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done 可以重写为
find /var/lib/docker -type f -name '*.log' -size +25M -exec sh -c '
for log
do
echo "clean logs : $log"
cat /dev/null > "$log"
done' sh {} +或者,如果您有GNU truncate实用程序,
find /var/lib/docker -type f -name '*.log' -size +25M \
-exec echo "clean logs: " {} \; -exec truncate --size=0 {} +或者,用GNU find,
find /var/lib/docker -type f -name '*.log' -size +25M \
-printf 'clean logs: %p\n' -exec truncate --size=0 {} +第二个循环可以用相同的方式重写,也可以将它们组合在一起:
find /var/lib/docker -type f -name '*.log' \
\( \( -size +25M -printf 'clean logs: %p\n' \) -o \
\( -mtime +7 -printf 'delete logs: %p\n' \) \) -exec truncate --size=0 {} +也见"理解-exec选项find“。
由于您的脚本只使用标准sh语法,因此可以另外将第一行更改为#!/bin/sh。
发布于 2020-04-19 08:40:01
例如,需要更改使用find的两行
查找/var/lib/docker/ -type f -name *.log -size +25M
问题在于未引用的*.log。把它放在单引号里,'*.log'。
原因是,当没有引用时,shell可以访问它并展开它以匹配当前目录中的文件。如果您有两个或多个日志文件,您将得到类似的内容,这将触发您正在看到的find错误
find /var/lib/docker/ -type f -name aa.log bb.log cc.log -size +25Mhttps://unix.stackexchange.com/questions/581064
复制相似问题