내 클린 도커 로그 스크립트는 다음과 같습니다(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=
작동하게 하려면 어떻게 해야 합니까?
답변1
내 답변에서 언급했듯이이전 질문*.log
, 호출 전에 쉘이 현재 디렉토리의 이름으로 패턴을 확장하지 못하도록 패턴을 인용해야 합니다 find
.
그렇지 않으면 반복하지 마세요 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 {} +
truncate
또는 GNU 유틸리티 가 있는 경우
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 {} +
여러분도 구경해 보세요”"find"의 -exec 옵션 이해".
스크립트는 표준 sh
구문만 사용하므로 첫 번째 줄을 #!/bin/sh
.
답변2
사용된 두 줄을 find
변경해야 합니다. 예를 들어 다음과 같습니다.
find /var/lib/docker/ -type f -name *.log -size +25M
질문은 인용되지 않았습니다 *.log
. 작은따옴표로 묶으십시오 '*.log'
.
그 이유는 인용되지 않은 경우 쉘이 이에 액세스하여 현재 디렉토리의 파일과 일치하도록 확장할 수 있기 때문입니다. 두 개 이상의 로그 파일이 있는 경우 다음과 같은 find
오류가 발생하게 됩니다.
find /var/lib/docker/ -type f -name aa.log bb.log cc.log -size +25M