외부 프로그램과 통신하기 위한 스크립트 세트를 작성 중입니다. 내 문제는 스크립트가 짧은 시간 동안만 "활성"이지만(더 큰 프로그램 내에서 키를 누를 때 발생) 외부 프로그램은 호출 간에 계속 실행되어야 하며 원래는 대화형 사용을 위해 설계되었다는 것입니다(디버깅 장치를 생각해 보세요). ).
이 프로그램을 실행하기 위한 스크립트를 작성하고 싶다면 PTY를 열고 여기에 데이터를 보내고 받을 것입니다. 이것은 작동하지만(내 스크립트는 LUA에 있고 lty는 PTY를 처리할 수 있음) 스크립트가 종료될 때 프로그램이 계속 실행되지 않습니다.
외부 프로그램이 연결할 소켓을 제공하는 경우(gdb처럼) 이름을 어딘가에 저장하고 각 스크립트를 해당 소켓에 연결할 수 있습니다. 하지만 이는 대화형으로만 사용할 수 있습니다.
외부 프로그램을 시작하고 PTY를 연 다음 소켓 자체를 수신하는 데몬을 작성할 수 있습니다. 그런 다음 스크립트는 데몬의 소켓에 연결하여 데이터를 보낼 수 있으며 데몬은 PTY를 통해 데이터를 프로그램에 전달하고 결과를 다시 보냅니다.
외부 프로그램과 교환하는 데이터 형식은 라인 기반이지만 단일 명령에서 얼마나 많은 라인을 반환할지 미리 알 수 없습니다. 하지만 PTY는 문제가 되지 않습니다 luasocket
.
이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다. 어떻게든 프로그램의 PTY를 열고 해당 "주소"를 얻을 수 있으므로 나중에 스크립트 내에서 여러 번 연결하고 연결을 끊을 수 있습니까? (한 번에 하나의 스크립트만 실행할 수 있으므로 동시성은 문제가 되지 않습니다.) 이렇게 하면 소켓을 완전히 사용하지 않아도 됩니다.
socat
아니면 이미 이 작업을 수행할 수 있는 몇 가지 옵션 조합이 있습니까 ?
답변1
"프로그램의 PTY를 열 수 없습니다". PTY는 의사 터미널입니다. 터미널이 필요합니다. 터미널을 통해 프로그램과 직접 통신하려면 프로그램이 터미널을 만들어야 합니다(즉, 터미널 에뮬레이터처럼 동작).
대신 프로그램을 실행할 수 있습니다.존재하다터미널(예:화면. 화면을 사용하면 쉽게 입력을 주입하고 프로그램의 출력을 읽을 수 있습니다.
그러나 현재 수행 중인 작업에 대해 터미널은 쓸데없는 복잡성을 초래합니다. 소켓은 두 프로그램 간의 직접 양방향 통신을 수행하려는 작업에 딱 맞는 도구입니다. (단방향 통신의 경우 파이프가 올바른 도구가 될 것입니다.) 터미널 사용의 유일한 장점은 끝 중 하나를 제어하지 않고 출력이 제어되지 않으면 출력 버퍼링을 고집한다는 것입니다. 터미널의 줄이 아닌 덩어리로.