子プロセスの子プロセスのpid

子プロセスの子プロセスのpid

私は下付き文字を呼び出すスクリプトを実行しています。これは順番に他の下付き文字とプロセスを呼び出します。

一部のサブプロセスは、ディスクIOとCPUを大量に使用し、CPUを過熱してクラッシュまたはエラーを引き起こします。 Intelに感謝しなければならないようです。これは私の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

関連情報