スクリプトは手動で実行されますが、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

関連情報