2016-11-27 4 views
1

データベースを初期化するためのbashスクリプトを作成しようとしています。今はすべてうまくいっています。データベースの作成、ユーザーの作成、データベースに対するユーザーのアクセス許可の付与ができました。Bash whileループがmysqlのインポートを待機する

ここで、インポートスクリプトを実行します。私はmysqlコマンドを実行するだけでそれを行うことができますが、ユーザーは潜在的に1〜2分、フィードバックなしでそこに座っています。

だから、コマンド実行中にスピナーを使うことにしました。

i=0 
spin='-\|/' 
echo "Beginning Data Import. This may take a while..." 
while ((mysql -u$newUser -p$newPassword -D$dbName < import.sql) &>/dev/null &); do 
    i=$(((i+1) %4)) 
    printf "\rImporting milestone SQL (All data)... ${spin:$i:1}" 
    sleep .3 
done 

私は、このコマンドの他のバリエーションを使用しましたが、それらはすべてa)は、スピナーは永遠にいっている

のいずれかになるように見えます。それは停止しない、または

b)は、それはMySQLのインポートコマンドを複数回私はグーグルで試してみたが、私の質問に答える何かを見つけるように見えることはできません

を実行しません。ほとんどは、私は

while ((mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &) != 1 

ような何かを行うことができます示すように見えるが、それは構文エラー、または通常は無限ループで、その結果、どちらか動作するようには思えません。あなたがこれを行う場合は

+0

ご覧ください:http://www.shellcheck.net/ – Cyrus

+0

ありがとうございましたが、唯一のことは「シェルは曖昧さを排除します((最初は(サブシェルを開始し、スペースの後にスペースを入れてください。最初の括弧の後ろにスペースを入れても無限ループです。 –

答えて

2

while ((mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &) 

を...シェルは、バックグラウンドでmysqlを立ち上げています。

(mysql -u$newUser -p$newPassword -D$dbName < l1jdb_m9.sql) &>/dev/null &の結果はほとんど常に真の値になります。すなわち、コマンドを開始すると成功します。 whileはこの真の結果を受け取り、反復を開始します。ループの終わりに、式を再度実行して反復を続行するかどうかを確認します。式が再び実行されるので、バックグラウンドでmysqlが再度実行され、再度成功します。

ループはこれを永遠に行い、反復ごとに新しいmysqlコマンドをバックグラウンドで起動します。バックグラウンドで起動しているので、結果を待つことはありません。それは火と忘れて、そして常に真実を返します。

あなたはコマンドが完了するまで待機する場合は、このような何か行うことができます:サブプロセスのPID($!)をキャプチャし

mysql -u$newUser -p$newPassword -D$dbName < import.sql &>/dev/null & 
mysql_pid=$! 
while (ps -p $mysql_pid >&-); 
do 
    i=$(((i+1) %4)) 
    printf "\rImporting milestone SQL (All data)... ${spin:$i:1}" 
    sleep .3 
done 

を、そして見るために各ループの反復でチェックプロセスがまだ実行中の場合は、ps -pとなります。 >&-は出力を破棄し、psはプロセスが実行中の場合はtrueを、そうでない場合はfalseを返します。これは各繰り返しを再評価されるので、プロセスが完了するとループは終了します。

+0

ありがとうございました! -p行。出力を停止するために使用していたものと仮定し、 "&>/dev/null"に変更し、エラーを修正しました。記述子 " –

+0

'>というよりダッシュで '>& - 'です。つまり、 "標準入力と出力を閉じる"を意味します。 '>/dev/null'へのリダイレクトはまあまあです。 –

+0

申し訳ありませんあなたがそれを見た後で私のコメントを編集しました - それはそれをSOに入れたときのタイプミスでした。私は>& - をやっていたが、私の前提が正しかったことはうれしい。再度、感謝します! –

関連する問題