나는 포그라운드 프로세스 접근 방식이 너무 많은 노력을 필요로 한다는 점을 부인합니다.
zsh
포그라운드에 프로세스가 있다고 가정해 보겠습니다. .disown
SIGHUP
현재는 Ctrl+로 시작하는 백그라운드로 이동하여 z프로세스를 일시 중지한 다음
$ disown
disown: warning: job is suspended, use `kill -CONT -32240' to resume
$ kill -CONT -32240
$
—그 다음에터미널을 닫을 수 있어요.
이를 어떻게 자동화할 수 있나요? 이상적으로는 Ctrl+ j또는 다른 키를 눌러 실행 중인 프로세스를 즉시 거부 할 수 있기를 바랍니다 . 아니면 두 번째로, SIGCONT
프로세스를 거부하고 일시 중지하는 명령을 실행할 수 있었으면 좋겠습니다 .
답변1
터미널에서 Ctrl+를 누르면 Z포그라운드 프로세스 그룹이 SIGTSTP 신호를 수신하게 됩니다(터미널이 베이크 모드에 있고 기본 키 바인딩이 있다고 가정). 프로세스가 SIGTSTP에 대한 신호 처리기를 설정하지 않으면 프로세스가 일시 중단됩니다(프로세스가 신호 처리기를 설정하더라도 일반적으로 일시 중단되기 전에 소량의 처리만 수행함). 프로세스가 종료되거나 일시 중지되거나 재개되면 해당 상위 프로세스는 SIGCHLD 신호를 통해 통지됩니다. 이로 인해 쉘이 새 프롬프트 및 유사한 메시지를 표시하게 됩니다 [1] + 1234 suspended foo
. 정보 흐름은
key→shell→suspension
이 아닌
key→suspension→shell 이므로 + 에 대해 다른 반응을 구성
할 수 없습니다 .CtrlZ
SIGCHLD에 대한 트랩을 설정할 수 있지만 작업이 현재 포그라운드 작업인 경우 트랩이 실행되지 않습니다. 대부분의 경우 이는 포그라운드 작업이 종료될 때가 아니라 백그라운드 작업이 종료될 때만 트랩이 실행된다는 것을 의미합니다. 하지만 이는 포그라운드 작업 일시 중지에 대응할 수 없다는 의미이기도 합니다.
precmd
precmd
작업 상태를 마지막 실행에서 저장된 상태와 비교하는 후크를 설정하여 백그라운드 작업의 변경 사항에 간접적으로 반응 할 수 있습니다 . 하지만 이것으로 무엇을 할 수 있는지는 모르겠습니다. 일시 중지 키만 있을 수 있으므로 프로세스를 일시 중지할지, 백그라운드로 할지 또는 거부할지를 알기 위해서는 추가 정보가 필요합니다.
빈 프롬프트에서 Ctrl+를 누르면 Z현재 작업이 백그라운드로 실행되도록 zsh를 설정했습니다. 이를 통해 Ctrl+를 Z두 번 눌러 잠시 동안만 정지하면서 전경 작업을 배경으로 전환할 수 있습니다 .
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
disown
원하시면 전화하시면 됩니다. 또는 Ctrl다음과 같은 테스트되지 않은 수정을 통해 세 번째 +가 호출되도록 준비할 수도 있습니다 Z.disown
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
if (($fancy_ctrl_z_already_bg)); then
disown
else
bg
fancy_ctrl_z_already_bg=1
fi
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
fancy_ctrl_z_precmd () {
fancy_ctrl_z_already_bg=0
}
precmd_functions+=fancy_ctrl_z_precmd
답변2
전역 키 바인딩을 사용하여 포그라운드 프로세스를 거부하는 것은 불가능합니다. 키 입력은 쉘이 아닌 포그라운드 프로세스에 의해 수신됩니다. 거부하려면 Ctrl먼저 +를 눌러 일시중지해야 합니다.z
그러나 속도를 높이는 zsh 옵션이 있는 것으로 밝혀졌습니다.거부하고 계속 진행하세요.: 네 setopt AUTO_CONTINUE
, disown
자동으로 전송됩니다 SIGCONT
.
그래서 로 낮추시면 됩니다 C-z
disown
.
답변3
두 번째 방법은 +를 누른 후 Ctrl와 의 z조합을 입력하는 것입니다.%
&|
$ %&|
필요하지 않은 경우 프로세스가 거부됩니다 SIGCONT
.
~에서zsh 내장 기능 (1)[타원 추가]:
SHELL BUILTIN COMMANDS … disown [ job ... ] job ... &| job ... &! … If one of the latter two forms is used, the jobs will automatically be made running …
그리고기타(1)[타원 추가]:
JOBS … A job can be referred to by … the following: … %string The last job whose command line begins with string.