그래픽 터미널에서 실행되는 ncurses 프로그램이 있고 해당 터미널 외부에서 내가 선택한 다른 프로그램으로 top
대체될 명령을 실행하고 싶다고 가정해 보겠습니다.top
이 문제를 해결하는 일반적인 방법이 있다고 생각합니다.
- 올바른 창의 PTY 찾기
- PTY를 유지하면서 터미널에서 프로그램 종료
- 대체 명령을 생성하고
- PTY I/O를 연결하여 명령 읽기/쓰기
이 문제를 해결하기 위해 기존의 일반 솔루션을 Google에서 검색했지만 유용한 포인터가 생성되지 않았습니다.
이에 대한 구체적인 사용 사례: gnome-terminal에서 실행 중인 tmux 클라이언트를 하나의 /tmp/tmux-$UID/Socket(=서버)에서 창을 "잃지" 않고 동일한 사용자에 속한 다른 클라이언트로 전환하고 싶습니다.
런타임 시 연결된 tmux 클라이언트를 새 소켓에 연결/부착할 수 없기 때문에 일반적인 솔루션을 찾고 있습니다.
답변1
내가 아는 한, 이를 위한 보편적인 해결책은 없습니다. tmux 클라이언트는 gnome-terminal의 개입 없이는 gnome-terminal이 통신하는 pty를 변경하거나 pty가 속한 프로그램(마스터 또는 슬레이브)을 변경할 수 없습니다. 매우 번거로운 코드입니다(예를 들어 원하는 것과 반대되는 작업을 수행하는 reptyr 참조 - pty를 다른 프로그램으로 이동하는 대신 프로그램을 다른 pty로 이동).
특히 tmux의 경우 tmux가 충분히 새로운 경우(2.4 이상) detach-client -E
실행 중인 tmux 클라이언트를 다른 프로세스로 바꿀 수 있습니다. 이는 다른 tmux 클라이언트일 수 있습니다. 예를 들면 다음과 같습니다.
tmux -Lfirstsocket detach -E 'tmux -Lsecondsocket attach'
tmux가 충분히 새롭지 않은 경우 옵션은 다음으로 제한될 수 있습니다.
새 tmux 클라이언트를 사용하여 gnome-terminal에서 새 탭을 열고 원래 탭을 닫습니다.
gnome 터미널을 완전히 닫고 원하는 프로그램이 포함된 다른 터미널을 엽니다.
이전 tmux에서 새 tmux를 연 다음 상태 표시줄을 숨기고 이전 tmux에서 접두사 설정을 해제하면 계속 실행되지만 방해가 되지 않습니다.
답변2
터미널 에뮬레이터의 문제점은 생성한 실행 파일이 종료될 때 닫힌다는 것입니다. 그러나 터미널 에뮬레이터 내에서 다음과 같은 작은 래퍼를 실행할 수 있습니다.
- UNIX 소켓에서 명령을 수신합니다.
- 그것을 실행하고,
- 새 메시지가 도착하면 명령을 종료합니다.
- 1로 이동합니다.
이 같은작은 점. 파일을 디렉터리에 저장하고 다음을 사용하여 서버를 컴파일할 수 있습니다.
gcc -Wall -o server libwrapper.c server.c
고객과:
gcc -Wall -o client libwrapper.c client.c
터미널에서 서버를 실행합니다.
./server
그리고 클라이언트 스위치 명령을 통해 다른 클라이언트에서:
./client /bin/cat /etc/motd