자식 프로세스의 자식 프로세스의 pid

자식 프로세스의 자식 프로세스의 pid

저는 아래 첨자를 호출하는 스크립트를 실행하고 있으며, 이 스크립트는 차례로 다른 아래 첨자와 프로세스를 호출합니다.

일부 하위 프로세스는 디스크 IO와 CPU를 많이 사용하고 CPU를 과열시켜 충돌이나 오류를 일으킵니다. 인텔에게 감사해야 할 것 같습니다. 이것은 내 CPU를 고치기 위한 정보 요청이 아닙니다.

CPU를 식히기 위해 5분마다 2분 동안 스크립트를 일시 중지하고 싶습니다.

이것은 내 상위 스크립트에서 가져온 것입니다.

for dir in * ; do
        if [ -d "$d" ]; then
                printf "$dir."
                ./subscript.sh "${dir}" & 
                        echo "$!" > ./"${dir}.pid" & 
                        ./pauser.sh "${dir}"
                #rm ./"{d}.pid"
        touch "{d}.pid.ended"
        fi
done

이것은 내 Pauser.sh 스크립트입니다.

#!/bin/bash
pauser() {
        printf "@" && 
                sleep "${2}m" && 
                check_running "${1}" && 
                kill -STOP "$(cat ${1}.pid)" && 
                sleep "${3}m" && 
                printf "." && 
                check_running "${1}" && 
                kill -CONT "$(cat ${1}.pid)"
}
check_running() {
        if [ -f "${1}.pid.ended" ]; then
                rm "${1}.pid.ended"
                exit 0
        fi
}
while true
do
        if [ -f "${1}.pid.ended" ]; then
                rm "${1}.pid.ended"
                exit 0
        else
                pauser "${1}" "5" "2"
        fi
done

이 일시 중지 스크립트는 하위 프로세스의 하위 프로세스를 일시 중지하지 않습니다. 하위 스크립트/프로세스의 하위가 다른 PID를 갖고 있기 때문인 것 같습니다.

하위 프로세스의 하위 프로세스를 그룹화할 수 있다는 내용을 읽었습니다. 그렇다면 상위 스크립트에서 전체 하위 프로세스 그룹을 일시 중지하고 다시 시작하려면 어떻게 해야 합니까?

답변1

@PSkocik 감사합니다여기set -m, 하위 프로세스 전후로 이동할 수 set +m있으며 이렇게 하면 각 하위 프로세스가 자체 그룹에 설정됩니다.

이 하위 프로세스의 모든 하위 프로세스도 동일한 그룹에 속하므로 모두 동일한 그룹 ID를 갖습니다.

kill -STOP -${pid_to_pause}그룹 ID도 그룹 pid의 가장 오래된 것이지만 상위 스크립트는 아니기 때문에 프로세스 ID 앞에 음수를 사용하여 전체 그룹을 일시 중지합니다.set -m

내 새 상위 스크립트:

for dir in * ; do
    if [ -d "$dir" ]; then
        printf "$d."
        set -m
        ./subscript.sh "${dir}" & 
            echo "$!" > ./"${d}.pid" & 
            ./pauser.sh "${dir}"
        #wait
        set +m
        #rm ./"{dir}.pid"
        touch "{d}.pid.ended"
    fi
done

나의 새로운 일시정지 스크립트:

#!/bin/bash
pauser() {
    sleep "${2}m" && 
        check_running "${1}" && 
        printf "," && 
        kill -STOP "-$(cat ${1}.pid)" && 
        sleep "${3}m" && 
        check_running "${1}" && 
        printf "." &&
        kill -CONT "-$(cat ${1}.pid)"
}
check_running() {
    if [ -f "${1}.pid.ended" ]; then
        rm "${1}.pid.ended"
        exit 0
    fi
}
while true
do
    if [ -f "${1}.pid.ended" ]; then
        rm "${1}.pid.ended"
        exit 0
    else
        pauser "${1}" "15" "5"
    fi
done

관련 정보