私は下付き文字を呼び出すスクリプトを実行しています。これは順番に他の下付き文字とプロセスを呼び出します。
一部のサブプロセスは、ディスク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