bash`suspend` 내장 명령의 목적은 무엇입니까?


22

나는 타이핑 help suspend하고 다음과 같은 간단한 설명을 얻었습니다.

suspend: suspend [-f]
    Suspend shell execution.

    Suspend the execution of this shell until it receives a SIGCONT signal.
    Unless forced, login shells cannot be suspended.

    Options:
      -f    force the suspend, even if the shell is a login shell

    Exit Status:
    Returns success unless job control is not enabled or an error occurs.

내가 이것을 이해하는 방법 : 나는 타이핑 suspend하고 터미널이 멈추고 strg + c조차도 동결을 풀 수 없습니다. 그러나 다른 터미널을 열고 얼어 붙은 터미널에 대한 PID를 검색하고 입력 kill -SIGCONT PID-NR하면 SIGCONT 신호가 얼어 붙은 터미널로 전송되어 해동되어 얼어 붙지 않습니다.

그러나 터미널을 일시 중단하는 실제 목적은 무엇입니까? 일상적인 응용 프로그램은 무엇입니까? 쉘을 내장 한 사람들은 무엇을 염두에 두었습니까?


2
일시 중단을 위해 외부 프로그램 (kill)을 실행하지 마십시오.
Ipor Sircer 12

답변:


23

다른 쉘에서 쉘을 시작하면 내부 쉘을 일시 중단 할 수 있습니다. 를 사용할 때 su잠시 동안 일반 사용자로 다시 전환하고 싶다고 말하십시오 .

user$ su
Password: ...
root# do something
root# suspend
user$ do something as the ordinary user again
user$ fg
root# ...

(그렇다면 백그라운드에서 열린 특권 쉘을 잊지 마십시오 ...)

마찬가지로 다른 프로그램 ( !예 : 의 명령)에서 셸로 이스케이프하면 셸을 less일시 중단 할 수 있습니다. 그러나 많은 다른 프로그램이 하위 프로세스를 시작할 때 잘 처리하지 않을 것이라고 기대하지 않습니다.


1
난 그냥 실행 시도 vim하고했던 :sh서브 쉘 (구체적으로는 얻을 zsh서브 쉘을). 러닝 suspend으로 인해 원래 쉘에 들어갔습니다 (서브 쉘과 vim을 모두 중단했습니다).
Kevin

1
@Kevin, zsh보다 똑똑한 것 같습니다. 그리고 (Debian 's ) bash모두에서 탈출하려고 했습니다. 부모 앱도 중지하고 모든 것을 중단했습니다. 로 작동하지만. lessvivim.tinyzshbashbashbash
ilkkachu

1
나는 sudo su를 입력하는 것이 서브 쉘을 시작한다는 것을 알지 못했습니다. 메인 쉘에 일시 중단을 입력하면 쉘이 단순히 멈 춥니 다.하지만 어떻게 보여 주었습니까? 서브 쉘 내부에서 쉘을 넘기면 자동으로 메인 쉘로 돌아갑니다.
상어

25

그것은 Ctrl+Z다른 명령 을 누르는 것과 같습니다 .

쉘을 일시 중단하고 상위 쉘 또는 프로세스가있는 경우 제어를 다시 제공합니다.

예:

zsh$ bash
bash-4.4$ cd /
bash-4.4$ suspend
zsh: suspended (signal)  bash
zsh$ fg
[1]  + continued  bash
bash-4.4$ pwd
/

이 기능은 80 년대 초 BSD 쉘 (작업 제어가 제공되는 곳) 인 csh에서 제공됩니다 .

AT & T ksh에서는 kill -s STOP $$( 예, 따옴표없이! ) 의 내장 별명입니다 .

귀하의 경우 bash아마도 터미널 에뮬레이터가 직접 시작한 것일 수 있습니다. 그리고 터미널 에뮬레이터는 프로세스가 일시 중단 될 것으로 예상하지 않았습니다.

bash 세션 지도자였다. 세션 리더가 일시 중단 된 경우 기존 터미널을 확인하면 사용자는 세션을 다시 시작할 수 없습니다.

bashsuspend로그인 쉘인 경우이를 거부하여 해결합니다 . 그러나 귀하의 경우 터미널 에뮬레이터가 시작되지 않을 수 있습니다.bash 로그인 모드에서 안전 장치가 제대로 설치되지 않았습니다.

zsh그리고 mksh그들이 보낼 수 있기 때문에 문제가 없습니다 SIGTSTP(또한에 보내신 분 Ctrl+Z) 대신 CSH 같은 신호 SIGSTOP에 대한 (호출자의 프로세스 그룹에 mksh대한 쉘의 주요 프로세스 그룹에 CSH처럼 등이 zsh아닌$$ 단독 처리 ). SIGTSTP고아 프로세스 그룹에 전달되면 리더 그룹이 자격을 갖습니다. 아이디어는 SIGTSTP가 사용자가 재개 할 수없는 것을 일시 중단해서는 안된다는 것입니다.

에서 mksh또는 yash, 하나는 또한 사용할 수 있습니다 suspendA는 자체를 중단 서브 쉘 가지고 :

$ (set -x; sleep 1; suspend; sleep 2)
+ sleep 1
+ suspend
[1] + Stopped(SIGSTOP)     (set -x; sleep 1; suspend; sleep 2)
$ fg
[1] (set -x; sleep 1; suspend; sleep 2)
+ sleep 2

zshSIGTSTP를 호출자가 아닌 기본 프로세스 그룹으로 전송하면 작동하지 않습니다 . kill내장 된 모든 쉘에서 항상 kill -s TSTP 0대신 사용할 수 있습니다 .


4
일시 중단에 대한 일반적인 용도는 다음과 같습니다. in bash (그리고 아마도 많은 셸) : 긴 명령을 시작했을 때 중단하고 싶지 command .... &않지만 백그라운드에서 그랬습니다. 를 잊고 &이제 명령을) 중단없이 추가 할 수 있습니다 소원 : 당신이 할 수있는 ctrl-z입력 다음과 : bg백그라운드에서 최신 일시 중단 된 작업을 다시 시작합니다. (또는 bg %n작업 번호를 n사용 하여이 작업을 수행 하십시오. jobs일시 중단되거나 실행중인 작업 목록을 얻는 데 사용하십시오 )
Olivier Dulac

5
@OlivierDulac, 실제 suspend 명령 이 무엇인지 설명하지 않습니다 .
와일드 카드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.