![자식 프로세스의 자식 프로세스의 pid](https://linux55.com/image/195457/%EC%9E%90%EC%8B%9D%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20%EC%9E%90%EC%8B%9D%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20pid.png)
저는 아래 첨자를 호출하는 스크립트를 실행하고 있으며, 이 스크립트는 차례로 다른 아래 첨자와 프로세스를 호출합니다.
일부 하위 프로세스는 디스크 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