Ctrl-Z와 kill -STOP의 차이점은 무엇입니까?

Ctrl-Z와 kill -STOP의 차이점은 무엇입니까?

make대규모 프로젝트의 경우 셸에서 명령을 실행할 때 명령을 입력하여 CtrlZ프로세스를 중지하고 셸로 돌아갈 수 있습니다. 그런 다음 실행하여 fg프로세스를 계속할 수 있습니다.

저는 이것을 자동화하기 위한 쉘 스크립트를 작성하려고 합니다(구체적으로, 몇 초마다 CPU 온도를 확인하고 온도가 너무 높으면 컴퓨터가 쉽게 과열되므로 프로세스를 중지하십시오). 나의 첫 번째 시도는 다음과 같습니다(단순화).

make &
subpid="$!"

sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"

sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"

wait "$subpid"

불행하게도 이것은 작동하지 않았습니다. SIGSTOP프로세스로의 전송은 프로세스를 일시 중지하지 않았습니다(터미널로 출력을 계속 전송했다는 사실에서 알 수 있음). make &명령줄에서 실행하고 ;를 사용 SIGSTOP하여 프로세스 상태를 확인합니다 ps. 중지된 것으로 표시되었지만(보냈을 때 다시 시작됨 SIGCONT) 여전히 출력을 뿜어내고 코어 온도를 높이고 있었습니다! 중지하기 CtrlZ이런 문제가 발생한 적은 없지만 스크립트에서 이를 수행하는 방법을 모르겠습니다.

CtrlZ와 어떻게 다른 가요 kill -STOP? 쉘 스크립트에서 전자의 동작을 어떻게 얻을 수 있나요?

답변1

Ctrl-Z는 Ctrl-Z와 어떻게 다르며 kill -STOP쉘 스크립트에서 Ctrl-Z의 동작을 어떻게 얻을 수 있습니까?

CTRL-ZSIGTSTP는 일반적으로 전송되며(차단될 수 있음) 이러한 경우 쉘은 종종 tty를 이전에 저장된 상태로 재설정합니다. 그러나 더 중요한 것은 제어 터미널 프로세스 그룹이 셸의 PID로 설정되고 다시 복구를 사용하는 작업의 PID로 설정된다는 것입니다 fg.

원래 질문으로 돌아가서: 온도에 따른 주파수 스케일링을 사용하십시오.CPU 주파수실제로 못을 박는 데 더 나은 망치일 수도 있습니다.

답변2

음수 PID 값(세션 리더의 PGID)을 지정하면 프로세스 그룹의 모든 프로세스에 신호가 전송될 수 있습니다.

kill -STOP -"$subpid"

참고: 새 세션에서 프로그램을 실행하려면 를 사용하십시오 setsid make. 그러나 귀하의 경우에는 필요하지 않다고 생각합니다. 그러나 make가 재귀적으로 실행되면 각 make 인스턴스가 자체 리더가 될 수 있습니다(이건 확실하지 않습니다).

또 다른 옵션은 다음을 사용하는 것입니다 killall.

killall -STOP make

Ctrl+Z와 kill -STOP의 차이점:

  • Ctrl-Z는 실제로 차단될 수 있는 TSTP를 보냅니다.
  • STOP은 차단할 수 없습니다.

답변3

프로세스 를 중지하고 싶지 않고 프로세스 make를 중지하고 싶습니다.make그리고모든 하위 프로세스. make가 재귀적으로 실행되고 있을 것 같습니다.

시도한 set -m%1사용할 수 있습니다 "$subpid".

set -m스크립트 내에서 기본적으로 꺼져 있는 작업 제어를 활성화합니다 . 그래도 사용 사례에 적합해야 한다고 생각합니다.이것이 나쁜 생각이라는 것이 일반적인 합의가 있는 것 같습니다..

답변4

Ctrl+는 C신호를 통해 프로세스를 종료하는 데 사용됩니다 SIGINT. 즉, 예의입니다.죽이다.

Ctrl+ Z 신호를 보내 프로세스를 일시 중지하는 데 사용됩니다.신호 프로토콜, 이는 취소할 수 있고 프로세스를 다시 재개할 수 있는 수면 신호와 같습니다.

그러나 프로세스가 일시 중지되면 다음을 통해 다시 재개할 수 있습니다.fg (포그라운드에서 복원)그리고bg (백그라운드에서 계속됨), 하지만 종료된 프로세스를 재개할 수 없습니다. Ctrl+ C& + 를 사용하는 Ctrl것의 차이점 입니다 Z.

어떻게보다프로세스를 일시중지하시겠습니까?

보류 중인 명령이 여러 개 있는 경우 이를 나열하려면 이 jobs명령을 사용하면 됩니다. 출력은 다음과 같습니다.

[1]-  Stopped                 cat
[2]+  Stopped                 vi

어떻게죽이다백그라운드에 프로세스가 걸려 있습니까?

kill다음 명령을 사용하여 :

kill %n어디N는 작업 번호(작업 출력에서 ​​대괄호 안의 숫자)이므로 cat : 을 종료하고 싶습니다 kill %1.

관련 정보