스크립트는 수동으로 실행되지만 cron에서는 실행되지 않습니다.

스크립트는 수동으로 실행되지만 cron에서는 실행되지 않습니다.

내 mysql 복제 상태 모니터링에 따라. 다음 코드를 사용하여 간단한 쉘 스크립트를 작성했습니다.

#!/bin/bash
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < /tmp/mysql_repl_status.txt

문제는 이 스크립트를 수동으로 실행하면 제대로 작동하지만 cron을 사용하면 스크립트가 작동하지 않는다는 것입니다.

cron을 사용하면 date 명령의 출력만 포함된 메일을 받았습니다. 내 편에 무슨 문제가 있나요?

답변1

여러 가지 가능성:

  1. Cron은 cron에서 실행되는 스크립트에 전체 사용자 환경을 전달하지 않습니다. 따라서 $PATH와 같은 변수는 cron에서 실행되는 것과 사용자 터미널에서 실행되는 것이 다를 수 있습니다.

  2. Cron에서는 모든 줄 끝에 개행 문자가 필요하므로 crontab 파일 끝에는 항상 빈 줄을 유지하세요.


스크립트에 전체 경로를 지정하고 그것이 제대로 작동하는지 확인해 보세요.

#!/bin/bash
statfile=/tmp/mysql_repl_status.txt
/bin/date > $statfile
cd /usr/bin
/usr/bin/mysql -e "SHOW SLAVE STATUS \G" >> $statfile
/bin/mail -s "Netspective MySQL Replication Status" [email protected] < $statfile

답변2

Cron 작업은 컨텍스트가 거의 없이 실행됩니다. .my.cnf홈 디렉터리에 파일이 있는 경우 해당 파일 mysql에는 명령이 작동하는 데 필요한 인증 세부 정보가 포함될 수 있습니다. 인쇄되는 mail내용을 확인 하려면 전체 경로가 필요할 수도 있습니다 which mail.

답변3

모든 명령에 대해 전체 경로를 작성하는 대신 PATH스크립트 파일 자체에 변수를 설정하는 것이 도움이 될 것입니다.

#!/bin/bash
export PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
date > /tmp/mysql_repl_status.txt
cd /usr/bin/
"/usr/bin/mysql" "-e" "SHOW SLAVE STATUS \G" >> /tmp/mysql_repl_status.txt
mail -s "Netspective MySQL replication status" [email protected] < 
/tmp/mysql_repl_status.txt`

답변4

사용bash -l -c

예:

* * * * * bash -l -c '/dsds/fddfd/something.sh' > /tmp/something.log

관련 정보