참고 사항 : 나는 비슷한 질문을 모두 읽었습니다. 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 명령이 실행되는 방식과 어떤 방식으로 충돌 할 수 있습니다.
어느 쪽이든, 해결 된 주요 문제는 다소 우아하지는 않지만.