터미널 쉘을 사용할 수 있을 때 터미널 라인 설정을 구성해야 할 때 stty
.
저주를 실행 중인 프로세스에 디버거를 연결하면 현재 tty 설정으로 인해 디버거가 실행되지 않습니다(에코가 꺼지고 개행 문자가 변환되지 않음). 디버거를 제대로 사용할 수 있도록 echo
켜고 끌 수 있게 하고 싶습니다 ( ).onlcr
pdb
제어 설정을 확인하기 위해 프로세스( Ctrl
+ )를 일시 중지하면 이러한 터미널 설정이 변경되지 않습니다. 나는 Curs가 신호를 일시 중지/재개할 때 이러한 설정을 저장/복원할 수 있다고 생각합니다.z
stty
상위 셸을 일시 중지하지 않고 활성 프로세스를 사용하여 원격으로 터미널 설정을 지정하는 방법이 있습니까?
답변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에 .-p
pid
사용 가능한 경우 /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
.