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


14

make쉘에서 명령을 실행할 때 ( 큰 프로젝트에서) Ctrl-Z를 입력하여 프로세스를 중지하고 쉘로 돌아갈 수 있습니다. 그 후 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를 보낼 때 다시 시작되었지만 여전히 출력을 뿜어 내고 핵심 온도를 높이고있었습니다! Ctrl-Z를 사용하여 중지하면이 문제가 발생하지 않았지만 스크립트에서이를 수행하는 방법을 모르겠습니다.

Ctrl-Z와 다른 점은 무엇 kill -STOP이며 쉘 스크립트에서 전자의 동작을 어떻게 얻을 수 있습니까?


그리고 예, make재귀 적으로 실행되고 있습니다. 사실, 나는 그것이 몇 단계 깊숙이 간다고 생각합니다.
Taymon

답변:


12

Ctrl-Z와 다른 점은 무엇 kill -STOP이며 쉘 스크립트에서 전자의 동작을 어떻게 얻을 수 있습니까?

CTRL-Z일반적으로 SIGTSTP (차단 될 수 있음)를 전송하며, 다른 경우와 달리 쉘은 종종 이러한 경우 tty를 이전에 저장된 상태로 재설정합니다. 그러나 더 중요한 것은 제어 터미널 프로세스 그룹이 쉘의 PID로 설정된 다음 다시로 시작된 작업의 PID로 설정됩니다 fg.

원래 문제로 돌아 가기 : Cpufreqd 와 같은 온도 의존 주파수 스케일링을 사용하면 실제로 손톱에 더 나은 망치가 될 수 있습니다.


4

make프로세스 를 중지하고 싶지 않습니다 . make프로세스 를 중단 하고 모든 하위 프로세스 합니다. 나는 재귀 적으로 실행되고 있었다 내기.

당신은 시도 set -m하고 %1대신에 사용할 수 있습니다 "$subpid".

set -m기본 내부 스크립트에 의해 꺼져 "작업 제어"를 할 수 있습니다. 사람들이 일반적으로 나쁜 생각이라고 생각 하지만 사용 사례에 적합해야 한다고 생각합니다 .


4

세션 리더의 음의 PID 값-PGID를 지정하면 프로세스 그룹의 모든 프로세스에 신호를 보낼 수 있습니다.

kill -STOP -"$subpid"

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

다른 옵션은 다음과 killall같습니다.

killall -STOP make

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

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

PGID 접근 방식이 작동하지 않아 다음과 같은 출력 라인이 생성되었습니다 /usr/local/bin/myscript: line 38: kill: (-10202) - No such process. 백그라운드 프로세스가 계속 실행되었습니다. killall하위 프로세스 중 일부가 sh아닌 것으로 보이므로 접근 방식이 효과가 있다고 생각하지 않습니다 make.
Taymon

신호를 보내는 프로세스가 이미 완료된 것 같습니다. sh라는 서브 프로세스는 make에 의해 생성됩니다. make 및 많은 하위 프로세스의 경우 가장 좋은 방법은 모든 자식의 PID를 얻고 모두 중지하는 것입니다.
Jurij

쉘에서 수동으로 수행했지만 쉘 스크립트에서는 작동하지 않았습니다. 나는 이것이 수동으로했을 때 루트 PID (다른 사람들이 PGID를 상속받은)가 첫 번째 make명령의 루트 PID 였지만 스크립트에서 루트 PID가 쉘 스크립트 자체에서 왔기 때문이라고 생각 합니다. .
Taymon

1

Ctrl+ C는 신호로 프로세스를 죽이는 데 사용됩니다. SIGINT즉, 예의 바르게 입니다.

Ctrl+ Z 는 슬립 신호와 같은 SIGSTP 신호를 실행 취소하고 프로세스를 다시 시작할 수 있도록하여 프로세스 를 일시 중단하는 데 사용 됩니다.

그러나 프로세스가 일시 중단되면 fg (포 그라운드에서 다시 시작)bg (백그라운드에서 다시 시작)으로 다시 시작할 수 있지만 종료 된 프로세스를 다시 시작할 수는 없습니다. 즉 Ctrl+ C& Ctrl+를 사용하는 것의 차이점입니다Z 입니다.

일시 중단 된 프로세스 를 보는 방법은 무엇입니까?

일시 중단 된 명령이 여러 개인 경우 명령을 나열하면 jobs명령 이 사용 되며 출력은 다음과 같습니다.

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

방법 죽일 배경에서 일시 중단 된 프로세스를?

kill명령 을 사용하여 :

kill %n여기서 n 은 작업 번호 (작업 출력에서 ​​대괄호 안에있는 번호)이므로 cat :을 죽이고 싶습니다 kill %1.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.