내 cronjob이 쉘 스크립트를 실행하지 않는 이유는 무엇입니까?

내 cronjob이 쉘 스크립트를 실행하지 않는 이유는 무엇입니까?

매일 밤 데이터베이스 덤프를 생성하는 crontab이 있습니다.

20 3 * * * /path/to/dailydump.sh

dailydump.sh다음을 포함합니다:

#!/bin/sh

DATENAME=`date +%Y%m%d`

BASENAME="/path/to/dumps/db_${DATENAME}.sql"

/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME}

권한은 다음과 같습니다:

-rwx---r-x 1 ... dailydump.sh
drwxr-xrwx 2 ... dumps

내 cronjob이 작동하지 않는 이유는 무엇입니까?

루트 액세스 권한 없이 공유 서버에 있습니다. /var/log/cron또는 에 로그인이 없습니다 /var/log/syslog. /var/mail/<user_name>또는 에 메일이 없으며 (실제로 및 /var/spool/mail/<user_name>에는 아무것도 없습니다 ) 오류 메시지를 메일로 보내지 않으며 로그 파일을 저장하지 않습니다. 아무것도 반환하지 않습니다. (보다/var/mail//var/spool/[email protected]1 2 * * * /path/to/your/command &>/path/to/mycommand.logps -ef | grep cron | grep -v grep?https://serverfault.com/a/449652)

모든 파일을 새 도메인으로 이동하고 새 crontab을 설정해야 할 때까지 전체 설정이 제대로 작동했습니다. (예, 모든 경로와 데이터베이스 로그인 정보를 업데이트했습니다. 그것도 여러 번 확인했습니다.) 동일한 머신에 동일한 호스팅 공급자를 사용하고 있으므로 환경이 변경되지 않았습니다.

어떤 도움이라도 대단히 감사하겠습니다.


"해결책"

좋아, 이건 정말 이상해. 제공업체의 도움말 센터에서는 cronjob에 의해 실행될 스크립트가 비밀번호로 보호된 디렉토리 내에 있는 경우 -auth=user:password -source스크립트 경로 앞에 추가해야 한다고 말합니다. 그래서 나는 (적절한 인증을 통해) 다음을 추가했습니다.

20 3 * * * -auth=user:password -source /path/to/dailydump.sh

결과는 다음과 같습니다나에게 오류 메시지가 이메일로 전송되었습니다.( MAILTO=작동합니다) 나에게 알려주고 /bin/sh: -=: invalid option사용 가능한 옵션을 나열합니다. 도움말 센터의 예시에는 실제로 물리적 경로( /path/to/file)가 아니라 URL( http://...)만 나와 있어서 크론탭을 삭제 auth하고 다시 저장하고,source이제 f%§#ing cronjob이 실행됩니다!!'crontab은 이전과 똑같이 char를 char로 표시하지만 이제는 코드에 뚜렷한 변경 사항 없이 실행됩니다.

문제가 무엇인지는 모르겠지만 잘못된 코드를 삽입하고 다시 삭제하면 문제가 해결되었습니다. o_O 실제로 cronjob이 실행되는 것처럼 보입니다.했다항상 실행됩니다(그렇지 않으면 분명히 오류가 발생하기 때문입니다).아무것도 안 했어!매우 신비 롭습니다. 누군가 나에게 이를 (재현 가능한 방식으로) 설명할 수 있다면 나는 현상금 200을 제공하고 (필요한 이틀을 기다린 후) 보상할 것입니다.

또한 @chaos는 쉘 스크립트를 완전히 피하고 cron이 데이터베이스를 직접 덤프하도록 하는 또 다른 솔루션을 제공했습니다(아래 답변에 대한 설명 참조).

20 3 * * * /usr/bin/mysqldump -hhost -uusername -ppassword 데이터베이스 이름 > /path/to/dumps/db_$(date +\%Y\%m\%d).sql

백분율 기호를 이스케이프 처리하는 것을 잊지 마세요. 그렇지 않으면 스크립트가 "예기치 않은 EOF"를 발견하게 됩니다.

도움을 주신 모든 분들께 감사드립니다. 나는 다시 많은 것을 배웠습니다(비록 여기서 무엇이 잘못되었는지는 아니지만).

답변1

cron데몬이 실행 중이고 를 준수하는지 확인하기 위해 crontab작은 테스트를 수행할 수 있습니다. crontab다음과 같은 항목으로 편집하세요 .

* * * * * /bin/date >>/tmp/test

잠시 후 /tmp/test 파일을 확인하십시오. 파일이 없으면 데몬이 실행되고 있지 않을 가능성이 높습니다. 그렇다면 공급자의 지원에 연락하겠습니다.

편집하다:

cron 인스턴스의 환경을 결정하려면 다음을 수행하십시오.

* * * * * /usr/bin/id >>/tmp/test
* * * * * /usr/bin/env >>/tmp/test

이제 파일의 내용을 살펴보세요.

답변2

  1. 스크립트를 직접 실행하여 작동하는지 확인합니다.
  2. 스크립트 설정 방법에 따라 crontab에서 스크립트가 실행될 때 일부 쉘 환경 변수를 사용하지 못할 수 있습니다.

환경 변수가 문제인지 테스트하려면 스크립트를 수정해 보세요.

sh --login -c "/usr/bin/mysqldump -hhost -uusername -ppassword databasename > ${BASENAME} >  /path/to/LogFile.txt 2>&1"

관련 정보