• 締切済み

MySQL のプロンプトをグラブなりトラップなりしたい

Perl スクリプトからシェル コマンドなどを発行しています。 まずは、MySQL へパスワードつきでログインするコマンドを発行します。 これは難なくうまくいきました。 これに連続して MySQL のコマンドなりクエリなどを発行するように記述すると、(Perl のエラではないため) スクリプトは無事に完結するものの、コマンド (あるいはクエリ) が効いていません (コンソールから確認済み)。 ところが、スクリプトのほうでログインとクエリとの間に無理矢理に数秒の時間を作ると、その後に来るクエリが成功しています (コンソールから確認済み)。 MySQL どころか RDBMS ではありませんが、ウェブで検索したところ、プロンプトを待たずとも連続してコマンドを発行 (例では print でやっていました) すればよい、みたく書かれていました。実際は、上記のように私の MySQL のプロンプトの例ではうまくいきませんでした。3 秒くらい待てば十分なのですが、200/1,000 秒くらいの間隔で MySQL のプロンプトをグラブできるか否か、同一スクリプトの中から確認する方法はないでしょうか。 (DBI などは無関係の質問です)

みんなの回答

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

前回の回答は単なる秒未満のスリープとして示しましたが、繰り返し文に組み込む ことができます。MySQL は知らないので、別の例を挙げてみます。 select undef, undef, undef, 0.2 until flock ...; 上の例では flock が真を返すまで (すなわちファイルロックに成功するまで) 繰り 返し実行します。質問者の実行する文はわかりませんが、戻り値をチェックしながら 繰り返し実行するのはだめですか? select undef, undef, undef, 0.2 until system(command ...);

-ROM
質問者

お礼

新たな質問ができないので、いったん閉じます。 お読みいただき、ありがとうございます。

-ROM
質問者

補足

返り値を調べてみましたが、Perl からコマンド、ないしクエリを発行した時点で真となり、結果として MySQL が何らかの反応を返す/返さないのとは無関係のようです。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.1

秒未満の端数を指定するには、4項の select を利用することができます。 (非 UNIX 環境では、うまくいかないかもしれません)。次のコマンドは、 0.2 秒間スリープします。 select undef, undef, undef, 0.2;

-ROM
質問者

お礼

もっとも、DBI を使えば SQL クエリは発行できますが、先に書きましたとおり、本来の目的はそれではなく、どうしても「生」でコマンド発行の必要があるのです。

-ROM
質問者

補足

ありがとうございます。 ただ、希望はインターバルを取ることではなく、MySQL のプロンプトを捕まえたいのです。 少し乱暴ですが、自分のサーバなのでダミー プロセスを多数発生させてシステムをビジー状態にさせ、コンソールから MySQL のプロンプトを出させるのを遅らせ、それまでのあいだにクエリを入力すると、クエリが無効になることに気づきました (その後にプロンプトは立ち上がります)。 つまり、MySQL はプロンプトが出るまではコマンドやクエリを受け付けないので、これを待ち、その後できるだけ早くコマンドを発行したいのです。

関連するQ&A