살해 후 무슨 일이 일어나는가 - 계속?

살해 후 무슨 일이 일어나는가 - 계속?

프로세스를 일시 중지했습니다 kill -TSTP <pid>. 그런 다음 계속해 보십시오 kill -CONT <pid>. 그러나 프로세스가 완료된 후에는 제어권이 bash로 반환되지 않습니다. 왜 이런 일이 발생합니까? 그리고 이 문제를 어떻게 극복할 수 있을까요?

bash(예: bash-1)로 시작합니다 ./name.sh. 그런 다음 kill -TSTP <pid>bash-2를 통해 명령을 사용하여 프로세스를 일시 중지합니다. 마지막으로 kill -CONT <pid>bash-2를 통해 복원을 시도했습니다. 그러나 쉘 스크립트가 완료된 후에는 제어가 반환되지 않고 영원히 그대로 유지됩니다.

답변1

셸에서 시작된 프로세스에는 제어 TTY가 연결되어 있으며 셸에서 상속되며 프로세스 그룹에도 속합니다. '를 사용하여 파이프에서 여러 프로세스를 실행하거나 '를 사용하여 서브셸 표기법을 |사용하는 경우 해당 프로세스는 모두 동일한 프로세스 그룹에서 시작됩니다. ()사용자가 일시정지 키를 누르면 일반적으로Ctrl-Z키보드에서 TTY 계층은 SIGTSTP현재 포그라운드 프로세스 그룹의 모든 프로세스에 신호를 보내고 상위 쉘은 호출을 통해 깨어나 SIGCHLD거나 호출에서 반환되어 wait()TTY를 다시 처리합니다. 쉘은 TTY를 제어하고 쉘 자체가 자체 프로세스 그룹에 상주하므로 포그라운드에 있는 프로세스 그룹을 제어하는 ​​일을 담당합니다.

프로세스가 TTY의 현재 포그라운드 프로세스 그룹의 일부가 아닌 경우 TTY 계층은 SIGTTIN터미널에서 데이터를 읽으려고 시도하면 자동으로 프로세스를 중지하고 메시지를 표시합니다. 예를 들어 SIGCONTvim과 같은 대화형 텍스트 편집기로 보내면 복원되지만 키보드에서 다음 키 누르기를 가져오기 위해 SIGTTIN호출 read()되자마자 즉시 . 작업 제어 지침을 사용하여 fg쉘이 더 이상 포그라운드에 있지 않도록 다시 시작하기 전에 vim을 포그라운드 프로세스 그룹으로 이동해야 한다는 사실을 쉘에 알려야 합니다 .

답변2

kill -CONT쉘이 이해할 수 없는 것입니다.

따라서 셸에 영향을 주지 않고 프로세스를 계속 진행합니다.

이는 백그라운드 프로세스와 유사한 결과를 생성합니다.

프로세스를 계속하려면 전화하는 것이 좋습니다 fg. 또는 이것이 "현재 작업"이 아닌 경우 jobs모든 현재 작업 나열을 사용한 다음 전화하십시오(예를 들어 fg %3관련 작업이 작업 #3인 경우).

kill -CONT쉘을 호출하는 것과 쉘을 시작하는 것의 차이점은 fg사용될 때 fg쉘은 신호를 보내는 것 외에도 SIGCONTtty 프로세스 그룹을 재개된 프로세스의 그룹으로 설정한다는 것입니다. tty 프로세스 그룹에 대한 설정은 신호의 자동 전달을 제어 합니다 TSTP. 그런 다음 쉘은 명령을 기다리기 시작합니다.TTINTTOU

그러나 kill -CONT문제의 프로세스를 실행하는 쉘/tty와 다른 쉘/tty에서 호출하는 경우 분명히 외부 프로세스의 실행을 계속하는 것입니다. 트리거된 쉘은 kill -CONT프롬프트로 돌아가지만 이를 볼 수 있습니다.

관련 정보