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-Z
SIGTSTP는 일반적으로 전송되며(차단될 수 있음) 이러한 경우 쉘은 종종 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
.