HTTPサーバーを実行するアプリケーションがあります。アプリケーションにはコマンドラインインターフェイスもあります。アプリケーションはRubyで書かれており、起動に長い時間がかかります。このため、コマンドラインインターフェイスを使用するのは非常に遅いです。
# this is slow
$ my-app do something
私はしばしばHTTPサーバーのインスタンスをローカルで実行します。私はCLIの一種のタブであるサーバーのエンドポイントを作成しました。一連のパラメータ(コマンドラインのARGVなど)を受け入れ、サーバープロセスで適切なCLIコマンドを実行します。
# this is faster since the command is executed in the already-running process
$ curl http://my.app/cli?argv=do&argv=something
サーバーの実行中にCLIの代わりにこのエンドポイントを使用したいと思います。私の問題は次のとおりです。私のCLIコマンドのいくつかはインタラクティブです。サーバーに要求すると、サーバープロセスでcurl
はなく端末への読み取り/書き込みアクセス権が得られます。コマンドラインから直接実行するのと同様に、httpリクエストを使用して対話型コマンドを実行できるように、サーバーに端末への一時アクセスを許可する方法はありますか? 1つの可能性は、サーバーで名前付きパイプを開き、HTTP要求へのパスを返すことです。それでは、端末をこれにどのように「接続」しますか?
# this lets me interact with the command
$ my-app do something
# this does not
$ curl http://my.app/cli?argv=do&argv=something
答え1
httpを介してターミナルデバイスファイルのパスを渡すことでこの問題を解決することができました。次の方法でこのパスを取得できます。tty
$ curl http://my.app/cli?argv=do&argv=something&tty=$(tty)
次に、サーバーから渡されたttyファイルを開き、そのファイルを読み書きします(STDIN / STDOUTではありません)。