人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

シェルスクリプトでMySQLの mysqldumpバックアップ
を cronに登録しましたが、ダンプに失敗しています。
OS:FreeBSD 8.3

シェルスクリプトの場所
/usr/home/www/scripts/bk_mysql.sh
所有者:権限
-rwxr-xr-- 1 user1 wheel 398 Jun 10 19:45 bk_mysql.sh

内容
#!/bin/sh

BACK_DIR=/usr/home/www/www.example.com/backup
MYSQL_ROOT_PW=aaaaaaa

# mysqldump
cd $BACK_DIR
mysqldump -u root --password=$MYSQL_ROOT_PW --all-databases > mysql_`date +%y%m%d%H%M`.sql

cron は1分毎にテスト実行しています
*/1 * * * * root /usr/home/www/scripts/bk_mysql.sh
しかし、ダンプファイルが作られません。

なお、同スクリプト内で、以下のアーカイブのパターンではアーカイブ生成に成功していますので、パーミッションなどには問題ないのかな?
DATA_DIR=/var/db

cd $DATA_DIR
tar cvzf $BACK_DIR/mysql_`date +%y%m%d-%H%M` mysql
と思っています。

mysqldump 特有の問題なのでしょうか?
ご教示お願いします。


●質問者: gdwtseq
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● だわかき
●50ポイント

mysqldumpにパスは通っていますか?
確認して下さい。

それから、mysqldumpは重たい処理なので、cronで1分おきというのは現実的ではありません。1時間おきにしてみて下さい。


gdwtseqさんのコメント
アドバイスありがとうございます。 rootユーザーで、 # which mysqldump とやると、 /usr/local/bin/mysqldump と返ってくるので、パスは通っているという理解でしたが、 違うのでしょうか?

だわかきさんのコメント
cronはrootユーザーで実行されるわけではないので、mysqldumpをフルパスで記述してください。

2 ● haruo-31
●50ポイント ベストアンサー

$ which mysqldump
と入力して、表示されるパス (/sbin/mysqldump) といったパスで、
mysqldumpコマンドを置換すると良いと思いますよ。

*/1 * * * * root /usr/home/www/scripts/bk_mysql.sh
/etc/crontab に直書きしてるんでしょうか。
とりあえずrootがコマンドラインとして認識されている可能性を考えて、
shに置換してみてはいかがでしょう。

余談ですがrootでコマンドを実行するのは、あまりよくありません。
上記例では、mysqldumpによってディスクが本当にfullになってダウンするとか、
そういうことも起り得ます。 一般ユーザなら、95%で止めてくれたりします。(そういう設定がされている前提ですが)


gdwtseqさんのコメント
アドバイスありがとうございます。 /usr/local/bin/mysqldump -u root --password=$MYSQL_ROOT_PW --all-databases > mysql_`date +%y%m%d%H%M`.sql のように、絶対パスで書き直したら、ダンプに成功しました。 ありがとうございます。 また、「rootがコマンドラインとして認識されている可能性を考えて、 shに置換してみてはいかが」とは、どのようなことですか?

haruo-31さんのコメント
crontabには、2通りのフォーマットがあります。 ユーザ個人がcrontabコマンドを通じて編集できるcrontabのフォーマット(名前がややこしい...)、 システム全体で共有している/etc/crontabのフォーマットです。 前者のフォーマットは以下です。 [スケジュール] [コマンド] 後者は以下となります。 [スケジュール] [実行オーナー] [コマンド] どちらにスケジュールを書いているかわからなかったので、 もしかすると前者に、後者のフォーマットを使ったのかな、 ということで先のメッセージのように書きました。 あと、環境変数PATHはcronで実行されるときは通用しないと思っておいた方が良いです。 実行される親プロセスが違うことによるのですが、説明が長くなるので割愛します。 スクリプト中でecho $PATHとかしてみるとお膳立てがされていないことがわかります。 crontab冒頭にPATH = ...として自分でPATHを設定することができます。

a-kuma3さんのコメント
# 質問者さん向け >> 実行される親プロセスが違うことによるのですが、説明が長くなるので割愛します。 << ログインシェルによりますけど、例えば bash だと、ログインプロンプトが出る前に、.bash_profile とか .bashrc が読み込まれて実行されます。 PATH などの環境変数の設定は、ここでやっているはず。 ログインプロンプトから実行されるシェルスクリプトは、ログインシェルの子プロセスとして起動されます。 スクリプトを動かすシェルは、親のログインシェル (例えば、bash) の環境変数を引き継ぎます。 cron の場合には、これが働かない (/usr/bin/cron の子プロセスとして実行されるだけ) ので、プロンプトで動いてたスクリプトが cron で動かないのは何故、みたいなことになります。

gdwtseqさんのコメント
そうだったのかー! すみません。何度もご回答いただき、理解できました。 ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ