質問: Ruby GUIスクリプト(.rbw)からコンソールプロセスを開始することは可能ですか? 私はGUIのRubyツールを持っているので、例えばpingといった子コマンドラインプロセスを起動する必要があります。 Windowsでこれを行うと、コンソールウィンドウが表示され、コンソールプロセスが消えてしまいます。これは非常に面倒です。コンソールウィンドウを表示しないでGUI Rubyスクリプトからプロセスを開始することは可能ですか?バックティックオペレータまたは `Kernel#system` を使用すると、コンソールウィンドウが表示されます。下記の例を参照してください。 ``` require 'Tk' require 'thread' Thread.new { `ping 8.8.8.8` } TkRoot.new.mainloop ``` !enter image description here
回答: 問題は、Windows上のすべての実行可能ファイルは、GUI実行ファイルまたはコンソール実行ファイルのいずれかであると定義されています(それよりも詳細ですが、ここでは問題ありません)。あなたのRubyスクリプトを実行している実行可能ファイルはGUI実行可能ファイルです(実際にはGUIを構築するためにTkを使用しますが、スクリーンショットでは非常に単純なものです)、ping実行ファイルはコンソール実行ファイルです。 GUI実行可能ファイルがコンソール実行可能ファイルを開始すると、実行可能ファイルを実行するためにコンソールが*自動的に*作成されます。 **これを変更することはできません**。 もちろん、画像はそれより複雑です。これは、コンソールアプリケーションが実際にGUI(正しいAPI呼び出しを行うだけでよい)で動作することができるためであり、コンソールウィンドウを途切れることなく(適切にpingを開始する - 設定されたショートカットファイル)しかし、そのようなことはむしろ面倒です。最も簡単な方法は、Ruby自体をコンソールアプリケーションにすることで、コンソールウィンドウを常時表示させることです( [`.rb`](https://rubyonwindows.blogspot.com/2007/05/faq-scriptrb-versus-scriptrbw .html ) ではなく `.rb` の接尾辞を使用してスクリプト名を付けます)。はい、それは実際に問題を取り除くわけではありませんが、どんな厄介な点滅も止めます。 アプリケーションの目的としてpingを使用していた場合(つまり、サービスが稼働しているかどうかを調べるために)、Rubyにチェックコードを直接書くのではなく、サービスに接続することが可能かどうかpingはターゲットOSカーネルが稼動しているかどうかを測定するだけで、実行可能なサービスは測定しないためです。これは素晴らしい区別ですが、マシンが実行ファイルが実行されていない状態になりましたが、マシンは依然としてpingに応答していました。これは*非常に*奇妙で、精神的抽象を完全に破ることはできますが、起こる可能性があります。しかし、pingを例として使用しているだけなので、(やや問題のある)コンソール処理に集中することができます。それでも、サブプロセスを実行せずに実行できるのであれば、その方法を選択してください(Windows上であれば、どんな種類のUnix上であってもこの問題はまったくありません)。