한 번의 키 누르기로 Ctrl-Z 및 bg를 수행하여 백그라운드에서 프로세스를 계속하려면 어떻게해야합니까?


25

이 작업을 일시 중단하고 Ctrl-Z bg시퀀스가 너무 자주 계속되도록하는이 패턴을 따릅니다 .

단일 키 누르기로 압축 할 수있는 방법이 있는지 궁금합니다.

내 껍질은 zsh


나는 그것이 아마도 하드 코딩되어 있다고 말하고 싶다. 그러나 나는 100 %가 아니다
채드 해리슨

물론, 그러나 나는 우아한 해결책을 찾았습니다. superuser.com/a/161922/35223
Evgeniy Dolzhenko

답변:


24

Ctrl+의 Z순서는 없다 쉘, 단말기에 의해 처리된다. (유용한 배경 : '터미널', '쉘', 'tty'및 '콘솔'의 정확한 차이점은 무엇입니까? )

확장 할 수 없는 작은 기능 집합 만 터미널의 키에 바인딩 할 수 있습니다 . 이러한 기능에 바인딩 된 사용자 정의 할 수 있지만 다른 기능을 추가 할 수는 없습니다. 이러한 기능은 세 가지 범주로 분류됩니다.

  • 자체적으로 제공하지 않는 프로그램의 명령 줄 버전 (표준 모드, 요리 모드 (원시 모드와 반대)) (실제로는 거의 사용하지 않음) : 파일 끝 ( eof, Ctrl+ D), 줄 끝 ( eol, Ctrl+ M), 왼쪽 문자 삭제 ( erase, Ctrl+ H), 왼쪽 단어 삭제 ( werase, Ctrl+ W), 줄 삭제 ( kill, Ctrl+ U).
  • 수동 흐름 제어 : stop( Ctrl+ S), start( Ctrl+ Q). 터미널이 컴퓨터를 따라 잡을 수 없거나 그 반대의 경우 문자를 떨어 뜨린 오래된 직렬 터미널에서만 유용합니다.
  • 신호 : 인터럽트 ( intr, Ctrl+ C), 강제 종료 ( quit, Ctrl+ \), 일시 중단 ( Ctrl+ Z).

Linux를 포함한 일부 시스템은이 목록을 확장하지만 배경을 포함하는 시스템은 본 적이 없습니다. 커널의 터미널 드라이버와 터미널 에뮬레이터에서 모두 지원됩니다. 따라서 일시 중단 작업을 수행해야 전경 작업을 SIGTSTP 신호로 보냅니다 . 포 그라운드 작업 리더의 상위 프로세스 (일반적으로 쉘)에서 SIGCHLD 를 트리거합니다 . 쉘이 SIGCHLD를 받았을 때, 쉘은 waitpid왜 알림을 받았 는지 알아 내고 백그라운드 작업이 일시 중단되었음을 감지하면 알림 (예 :) [1] + 12345 suspended mycommand과 새로운 프롬프트를 표시합니다.

SIGCONT포 그라운드 작업에 신호를 보내도록 쉘을 프로그래밍 할 수 있습니다 . zsh에 후크가 있다고 생각하지 않으므로 소스 코드를 패치해야합니다. 그리고 zsh가 실제로 프로그램을 중단시킬 것인지 (이 프로그램이 잘못된 일을 할 수 있습니다, 정렬하는 동안 일시 중단하도록) 또는 배경을 알 수있는 방법이 없습니다.


내가하는 일은 zsh에서 Ctrl+ Z키 시퀀스 를 설정 하여 현재 작업을 백그라운드 로 설정하는 것입니다 ( %%). 이렇게하면 Ctrl+ Z Ctrl+ 를 눌러 전경 작업을 배경으로 보낼 수 있습니다 Z. 내가있는 동안 현재 입력 줄이 비어 있지 않을 때 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

질, 이것은 내가 기대할 수 없었던 믿을 수 없을만큼 완전하고 교육적이며 신중한 답변입니다! 정말 고맙습니다!
Evgeniy Dolzhenko 2016 년

2

위의 zsh와 같은 ^ z ^ z는 bash에서 가능하지만 약간 혼란스럽고 오랫동안 이것을 실행하지 않았습니다.

  • .inputrc에 매핑을 포함하십시오 "\C-z": "bg\n"
  • PS0 bash 변수에서`$ (stty susp ^ z) '를 포함 시키십시오
  • PROMPT_COMMAND bash 변수에 'stty susp ^ @'포함

따라서 명령이 실행될 때 suspend에 대한 ^ z가 켜지고 bash 프롬프트에서는 꺼집니다.


1

그래서 내가 원하는 것이 아니라 여기에서 해결책을 찾았습니다 /superuser//a/161922/35223

빈 명령 줄에서 bg를 실행합니다 (Ctrl + Z Ctrl + Z는 프로그램을 일시 중단하고 즉시 백그라운드에서 다시 시작합니다).


나는 이것이 zsh를 필요로한다는 것에 주목할 것이다. bash에서는 지원되지 않습니다. (어쨌든 상자 밖으로)
Kevin M

@KevinM bash에서 비슷한 함수를 작성할 수 있습니다 (적어도 기본 버전 작성 Ctrl+Zcall bg, 비어 있지 않은 입력 행을 감지하는 것이 확실하지 않습니다).
Gilles 'SO- 악마 그만'

0

이 명령을 처음에 포 그라운드에서 실행 한 다음 배경으로 전환 하시겠습니까? 더 간단한 방법이 있는지 모르겠습니다. 그러나 백그라운드에서 시작할 명령을 실행하려면 라인 끝에 앰퍼샌드를 추가하면됩니다. 예를 들어 ping google.com &백그라운드에서 핑을 시작합니다. 를 입력하지 않으면 상호 작용할 수 없습니다 fg.


1
고맙게도, 문제는 때로는 명령 실행에 얼마나 많은 시간이 걸리는지 알지 못하므로 대화식으로 실행 한 다음 백그라운드에서 계속 진행하는 것이 더 좋습니다. 받아 들인 대답은 매일 그것을 사용하여 놀라운 일입니다!
Evgeniy Dolzhenko

답변 주셔서 감사합니다. 허용되는 답변은 매우 깔끔합니다!
10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.