다음은 프로세스가 이미 종료 된 후 프로세스 종료를 피하려고 시도하는 것입니다. 동일한 프로세스 ID로 다른 프로세스를 종료 할 가능성이 줄어 듭니다 (이러한 종류의 오류를 완전히 피하는 것은 불가능할 수도 있음).
run_with_timeout ()
{
t=$1
shift
echo "running \"$*\" with timeout $t"
(
# first, run process in background
(exec sh -c "$*") &
pid=$!
echo $pid
# the timeout shell
(sleep $t ; echo timeout) &
waiter=$!
echo $waiter
# finally, allow process to end naturally
wait $pid
echo $?
) \
| (read pid
read waiter
if test $waiter != timeout ; then
read status
else
status=timeout
fi
# if we timed out, kill the process
if test $status = timeout ; then
kill $pid
exit 99
else
# if the program exited normally, kill the waiting shell
kill $waiter
exit $status
fi
)
}
like를 사용하면 run_with_timeout 3 sleep 10000
실행 sleep 10000
되지만 3 초 후에 종료됩니다.
이것은 지연 후 자식 프로세스를 종료하기 위해 백그라운드 시간 초과 프로세스를 사용하는 다른 답변과 같습니다. 타임 아웃 쉘이 이미 종료 된 경우 종료되지 않는다는 점을 제외하고 이것은 Dan의 확장 답변 ( https : //.com/a/5161274/1351983 ) 과 거의 동일하다고 생각합니다 .
이 프로그램이 종료 된 후에도 여전히 몇 개의 느린 "절전"프로세스가 실행되지만 무해해야합니다.
이것은 이식 할 수없는 쉘 기능을 사용하지 않기 때문에 다른 대답보다 더 나은 해결책 일 수 있습니다 read -t
및 사용하지 않습니다 pgrep
.