我正在运行一个调用子脚本的脚本,该子脚本又调用其他子脚本和进程。
某些子进程使用大量磁盘 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