스크립트는 수동으로 실행되지만 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을 사용하면 스크립트가 작동하지 않는다는 것입니다.

date 명령의 출력만 포함된 메시지를 얻으려면 cron을 사용하십시오. 나에게 뭐가 문제 니?

답변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전체 경로가 필요할 수도 있습니다 .mailwhich 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

관련 정보