Ctrl+Z는 htop을 배경으로 보내지 않습니다.

Ctrl+Z는 htop을 배경으로 보내지 않습니다.

저는 macOS 12.4, Apple M1에서 zsh를 사용하고 있습니다.

해당 명령으로 htop을 정상적으로 실행 htop하고 사용하면 ctrl+z예상대로 실행되고 프로세스가 백그라운드로 전송됩니다. 명령을 사용하여 다시 호출 fg한 다음 다음을 사용하여 다시 백그라운드로 보낼 수 있습니다.ctrl+z

그러나 htop을 실행하고 명령을 사용하여 백그라운드로 직접 보내면

htop &

evoke를 사용하면 더 이상 배경으로 보내지 fg않습니다 . 영향이 없습니다.ctrl+zctrl+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

htopncurses 애플리케이션은 일반적으로 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;

따라서 htopSIGTSTP에 영향을 받지 않거나 htop포그라운드에서 제대로 작동하지 않는 것이 아니라 해당 터미널에 SIGTSTP를 전송하는 문자가 없다는 것입니다.

내가 다음 htop과 같이 시작한다면:

htop & sleep 1

그런 다음 초기 설정을 검색하면 프롬프트 는 여전히 실행 중이므로 htop프롬프트로 돌아가지 않으며 , 이력서를 사용한 후에도 여전히 일시 중지할 수 있습니다 .sleephtop^Z

자체 라인 편집기에서 SUSP를 비활성화하면 동일한 동작이 발생 tcsh하지만 readline을 사용하는 bash 및 기타 쉘이나 테스트한 다른 여러 쉘에서는 그렇지 않습니다. 즉, ^Z자체 라인 편집기에 바인딩할 수 없습니다. 그 중 일부는 일부 특수 설정이 비활성화되어 있습니다. 예를 들어 bash는 LNEXT(보통 ^V)를 비활성화합니다.

관련 정보