[server] find -delete는 정상적으로 작동하지만 cron에서는 작동하지 않습니다.

참고 사항 : 나는 비슷한 질문을 모두 읽었습니다. cron, 경로, env 변수 등은 있지만 특정 문제에 대한 해결책을 제공하는 것은 없습니다.


MySQL 덤프를 만들고 다음과 같이 오래된 것을 삭제하는 스크립트가 있습니다.

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

( 위의 명령은 주석의 제안에 의해 원래 명령에서 수정되었습니다 )

그러나 cron이이 스크립트를 실행할 때 파일은 절대 삭제되지 않습니다. 크론 사용자는 루트입니다.

디버깅 노트

  • 명령이 나타나는 스크립트를 수동으로 실행하면 예상대로 삭제됩니다.

  • 위의 find 명령을 명령 줄에서 루트로 자체 실행하면 예상대로 삭제됩니다 (-print를 사용하면 예상대로 5 일보다 오래된 파일 목록이 반환됩니다)

  • 루트의 crontab에 명시적인 경로 설명을 추가했지만
    아무것도 변경되지 않습니다.

  • Cron은 오류를 보내지 않고 찾기 작업을 로그 파일로 파이프하면
    비어 있거나 전혀 생성되지 않습니다.

  • 우분투 서버 14.04.03 LTS를 사용하고 있습니다.



답변

문제는 실행될 때 설정 crontab되지 않았다는 것 $PATH입니다. 실제로 다음을 통해 열린 파일의 맨 위에 이것을 추가하여 경로를 제공 할 수 있습니다 crontab -e.

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

(또는 PATH선호하는 것). 즉, cron에서 직접 명령의 전체 경로를 지정하지 않아도됩니다.

원래 명령에 여러 가지 문제가 있습니다. 기본적으로 쉘 대신 와일드 카드 확장을 수행하도록 요청하고 find있습니다. 둘째, 당신은 rm; /bin/rm또는 /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


답변

대신 이것을 시도하십시오

find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete


답변

스크립트의 일부가 아닌 루트의 crontab에서 직접 find 명령을 호출하면 작동합니다.

문제의 스크립트는 csh를 사용합니다. 우분투의 루트 크론 환경은 / bin / bash (또는 / bin / dash?)를 사용한다고 생각합니다. 아마도 이것은 find 명령이 실행되는 방식과 어떤 방식으로 충돌 할 수 있습니다.

어느 쪽이든, 해결 된 주요 문제는 다소 우아하지는 않지만.


답변