bash 내장 명령 "일시 중지"의 목적은 무엇입니까?

bash 내장 명령 "일시 중지"의 목적은 무엇입니까?

입력했더니 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-NRSIGCONT 신호를 입력하면 동결된 터미널에 신호를 보내서 동결을 해제시켜서 동결을 해제시켜 줍니다.

그런데 단말기를 일시정지하는 진짜 목적은 무엇일까? 어떤 일상적인 응용 프로그램이 일반적입니까? 사람들은 이것을 쉘에 구축하기 위해 무엇을 생각하고 있었습니까?

답변1

다른 쉘에서 쉘을 시작하는 경우 내부 쉘을 일시중단할 수 있습니다. su일시적으로 일반 사용자로 전환하고 싶을 때 다음과 같이 표시됩니다.

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

(이렇게 하면 백그라운드에서 열려 있는 권한 있는 쉘을 잊지 마세요...)

!마찬가지로 다른 프로그램( 예: 의 명령 ) 에서 쉘로 이스케이프하는 경우에도 less해당 쉘을 중단할 수 있습니다. 그러나 하위 프로세스를 시작할 때 다른 많은 프로그램이 이 문제를 잘 처리할 것이라고 기대하지 않으며 하위 프로세스가 자체적으로 중단됩니다.

답변2

이는 다른 명령을 누르는 것과 같습니다 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
/

이 기능은 BSD의 쉘인 csh에서 제공됩니다(작업 제어는 여기에서 제공됩니다).1980년대 초.

AT&T ksh에서는 kill -s STOP $$(예, 따옴표가 없습니다!)

귀하의 경우에는 bash아마도 터미널 에뮬레이터에서 직접 실행했을 것입니다. 그리고 터미널 에뮬레이터에서는 프로세스가 중단될 것으로 예상하지 않습니다.

bash회의 주최자입니다 . 세션 리더가 일시 중지된 경우 이전 터미널의 관점에서 보면 사용자는 세션 리더를 재개할 수 없습니다.

bashsuspend로그인 셸을 거부하여 이 문제를 해결하세요. 그러나 귀하의 경우 터미널 에뮬레이터가 bash로그인 모드에서 시작되지 않을 수 있으므로 보안 조치가 적용되지 않습니다.

zsh그리고 mksh문제가 없습니다. 대신 csh와 같은 신호를 (그리고 별도의 프로세스 대신 csh와 같은 호출자의 프로세스 그룹 과 쉘의 기본 프로세스 그룹에 ) SIGTSTP보내기 때문입니다. 고아 프로세스 그룹에 전달할 때 무시되고 리더 그룹이 자격을 갖습니다. 아이디어는 SIGTSTP가 사용자가 재개할 수 없는 특정 작업을 일시 중지해서는 안 된다는 것입니다.Ctrl+ZSIGSTOPmkshzsh$$SIGTSTP

mksh또는 에서는 서브쉘을 yash사용하여 자체를 일시중단할 수도 있습니다 .suspend

$ (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대신 사용할 수 있습니다.

관련 정보