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 요청을 사용하여 대화형 명령을 실행할 수 있도록 서버에 터미널에 대한 임시 액세스 권한을 부여하는 방법이 있습니까? 한 가지 가능성은 서버에서 명명된 파이프를 열고 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 아님).