프로세스가 실행되는 동안 터미널 TTY 회선 설정을 지정합니다.

프로세스가 실행되는 동안 터미널 TTY 회선 설정을 지정합니다.

터미널 쉘을 사용할 수 있을 때 터미널 라인 설정을 구성해야 할 때 stty.

저주를 실행 중인 프로세스에 디버거를 연결하면 현재 tty 설정으로 인해 디버거가 실행되지 않습니다(에코가 꺼지고 개행 문자가 변환되지 않음). 디버거를 제대로 사용할 수 있도록 echo켜고 끌 수 있게 하고 싶습니다 ( ).onlcrpdb

제어 설정을 확인하기 위해 프로세스( Ctrl+ )를 일시 중지하면 이러한 터미널 설정이 변경되지 않습니다. 나는 Curs가 신호를 일시 중지/재개할 때 이러한 설정을 저장/복원할 수 있다고 생각합니다.zstty

상위 셸을 일시 중지하지 않고 활성 프로세스를 사용하여 원격으로 터미널 설정을 지정하는 방법이 있습니까?

답변1

프로세스의 stdout은 UNIX 시스템 어딘가에서 경로로 사용할 수 있는 파일 설명자입니다. tty 속성을 설정하려면 이 경로를 찾아야 합니다. 이것은 저주이므로 이 파일 설명자는 터미널 장치(pts/tty)를 가리킬 것입니다.

첫 번째 단계는 실행 중인 프로세스의 pid를 찾는 것입니다. pidof, pgrep또는 사용 ps aux:

ps aux | grep '<program arguments>'

실행 중인 프로세스의 pid가 있으면 proc프로세스에 연결된 터미널 장치의 경로를 사용하거나(사용 가능한 경우) 찾을 수 있습니다 lsof.


tty/pts 경로를 얻으려면 다음 명령을 사용하십시오 lsof.

 device="$(lsof -X -p <pid> | grep -o '/dev/.*' | grep -v urandom | uniq)"

그러면 다음과 같은 내용이 제공됩니다.

 device=/dev/pts/4

여기서는 lsof가 중단되는 것을 -X방지하기 위해 TCP 연결을 무시하고 lsof에 .-ppid


사용 가능한 경우 /proc(리눅스) 해당 pid에서 심볼릭 링크를 찾을 수 있습니다.

device=/proc/<pid>/fd/1

이제 출력 장치를 알았으므로 tty 속성을 설정할 수 있습니다.

stty onlcr echo icrnl icanon -F $device

기본적으로 stty는 현재 터미널 표준 입력의 tty 속성을 설정합니다. -F를 사용하여 경로를 지정할 수 있습니다.

이제 어떤 이유로 인해 이러한 속성을 계속 유지하려면 여러 번 설정해야 합니다.

while true; do stty onlcr echo icrnl icanon -F /proc/<pid>/fd/1; done

ps참고: 이 기사를 작성한 후 프로세스 옆에 추가 TTY를 나열할 수 있다는 것을 깨달았습니다 ps ao args,tty.

관련 정보