私の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
いくつかの可能性があります:
cron は、cron で実行されるスクリプトに完全なユーザー環境を渡しません。そのため、$PATH などの変数は、cron で実行する場合とユーザー端末で実行する場合で異なる場合があります。
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