子进程的子进程的 pid

子进程的子进程的 pid

我正在运行一个调用子脚本的脚本,该子脚本又调用其他子脚本和进程。

某些子进程使用大量磁盘 io 和 cpu,并使 cpu 过热,导致崩溃或错误。我想我应该为此感谢英特尔。这不是要求提供修复我的 CPU 的信息。

我想每 5 分钟暂停脚本 2 分钟,让 cpu 冷却下来。

这是我的父脚本中的:

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。

通过在进程 id 之前使用kill -STOP -${pid_to_pause}负数来暂停整个组,因为组 id 也恰好是该组 pid 中最高级的,但不是父脚本,因为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

相关内容