저는 macOS 12.4, Apple M1에서 zsh를 사용하고 있습니다.
해당 명령으로 htop을 정상적으로 실행 htop
하고 사용하면 ctrl+z
예상대로 실행되고 프로세스가 백그라운드로 전송됩니다. 명령을 사용하여 다시 호출 fg
한 다음 다음을 사용하여 다시 백그라운드로 보낼 수 있습니다.ctrl+z
그러나 htop을 실행하고 명령을 사용하여 백그라운드로 직접 보내면
htop &
evoke를 사용하면 더 이상 배경으로 보내지 fg
않습니다 . 영향이 없습니다.ctrl+z
ctrl+z
이것이 예상되는가? 제가 사용했을때 같은 문제는 없었습니다 vim &
.
답변1
Ubuntu htop
는 물론 mutt
.
문제의 원인은 zsh의 라인 편집기(zle)가 활성화되면 tty 장치 규칙의 모든 VQUIT, VSUSP, VDSUSP, VSWTCH, VLNEXT 특수 문자가 비활성화되므로 Ctrl+를 누르면 Zzle이 ^Z
시스템에서 메시지를 보내려는 시도를 수신한다는 것입니다. SIGTSTP(VSUSP 설정)를 포그라운드 프로세스 그룹으로 변경합니다.
너는 볼 수있어거기코드에서.
zsh가 줄 편집기를 떠나 명령을 실행하면(또는 작업을 다시 포그라운드로 가져오면) 터미널 상태가 복원됩니다( ^Z
이전과 마찬가지로 SUSP 복원 포함).
이제 TUI 애플리케이션을 시작하면 초기화가 백그라운드에서 진행되는 htop &
동안 라인 편집기에 즉시 다시 입력됩니다(프롬프트로 돌아갑니다) .htop
htop
ncurses 애플리케이션은 일반적으로 zle과 동일한 작업을 수행합니다. 즉, 초기 tty 설정을 검색하고, 용도에 맞게 변경하고, 종료(또는 일시 중지) 시 저장된 tty 설정을 복원합니다.
이제 문제는 백그라운드에서 시작될 때 ncurses 애플리케이션에 의해 검색된 초기 tty 설정이 zle에 의해 설정된 설정이고 일반 설정이 아니라는 것입니다. 초기화할 때 이미 프롬프트로 돌아왔기 때문입니다. 따라서 현재 SUSP가 비활성화된 것으로 표시됩니다.
설정을 변경하려고 하면(SUSP 설정 이외의 내용이 변경됨) 포그라운드에 있지 않기 때문에 SIGTTOU로 인해 일시 중지됩니다.
그런 다음 fg
이 작업을 수행하면 zsh는 SIGCONT를 애플리케이션에 보내기 전에 tty 설정을 다시 정상으로 되돌립니다. 그러나 애플리케이션은 tcsetattr()
초기 설정 위에 변경 사항을 적용하는 설정으로 되돌아가므로 비활성화된 일시 중지를 다시 적용합니다.
내가 실행하면 :
stty -a < /dev/pts/1
( /dev/pts/1
제 경우에는 tty가 htop
연결되어 복원되었습니다)
이해합니다:
intr = ^C; quit = <undef>; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = ^R; werase = ^W;
lnext = <undef>; discard = <undef>; min = 1; time = 0;
따라서 htop
SIGTSTP에 영향을 받지 않거나 htop
포그라운드에서 제대로 작동하지 않는 것이 아니라 해당 터미널에 SIGTSTP를 전송하는 문자가 없다는 것입니다.
내가 다음 htop
과 같이 시작한다면:
htop & sleep 1
그런 다음 초기 설정을 검색하면 프롬프트 는 여전히 실행 중이므로 htop
프롬프트로 돌아가지 않으며 , 이력서를 사용한 후에도 여전히 일시 중지할 수 있습니다 .sleep
htop
^Z
자체 라인 편집기에서 SUSP를 비활성화하면 동일한 동작이 발생 tcsh
하지만 readline을 사용하는 bash 및 기타 쉘이나 테스트한 다른 여러 쉘에서는 그렇지 않습니다. 즉, ^Z
자체 라인 편집기에 바인딩할 수 없습니다. 그 중 일부는 일부 특수 설정이 비활성화되어 있습니다. 예를 들어 bash는 LNEXT(보통 ^V
)를 비활성화합니다.