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


10

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


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

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

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

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

디버깅 노트

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

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

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

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

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


경로에서 와일드 카드 확장 (예 : * .gz)을 피합니다. cron은 모든 gz 파일을 확장하지는 않지만 * .gz로 해석 될 수 있습니다.
Archemar

조치없이 작업을 실행하면 어떤 결과를 얻을 수 있습니까?/usr/bin/find /home/bkp/dbdump/*.gz -mtime +5
user9517

@Archemar 왜 와일드 카드가 확장되지 않습니까? cron명령은 쉘을 통해 실행되며 쉘은 와일드 카드를 확장합니다.
Barmar

cron출력 및 오류 메시지가 포함 된 이메일을 보내야합니다. 이 직업에서 그러한 이메일을 받았습니까?
Barmar

@Iain 예상대로 작동합니다.
TommyPeanuts

답변:


6

문제는 실행될 때 설정 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

1
그것은이 있어야 $PATH세트를하지만, 시스템의 기본이 될 것입니다. 여기에는 /usr/bin및 이 포함 /bin되므로 rm명령 을 찾을 수 있어야합니다 .
Barmar

그래서 crontab에 $ PATH를 넣으려고했지만 (다른 곳에서 언급하지 않았더라도 시스템 경로가 기본값이 아닐 수도 있습니다) 모든 것이 전체 경로를 가지고 있는지 확인하십시오. 또한 찾기 경로에서 와일드 카드 대신 -name "* .gz"를 사용했습니다. 그러나 아무 일도 일어나지 않습니다. 명령이 실행되지 않고 오류가 발생하지 않습니다.
TommyPeanuts

3

대신 이것을 시도하십시오

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

왜 stderr을 파일로 리디렉션합니까? 기본적으로 출력이 있으면 이메일로 전송됩니다.
kasperd

예, 기본적으로 사용자의 스풀러 MAIL에 이메일을 보내고 메일을 사용하여 읽을 수 있습니다.
shad0VV

1
원래 명령과 동일한 효과를 얻으려면 추가해야합니다 -maxdepth 1.
Niels Keurentjes

0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.