Bir işlemi, çıktıktan sonra öldürmekten kaçınmaya çalışan, aynı işlem kimliğiyle başka bir işlemi öldürme şansını azaltan (bu tür bir hatayı tamamen önlemek mümkün olmasa da) bir girişim.
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
)
}
3 saniye sonra run_with_timeout 3 sleep 10000
çalışan sleep 10000
ancak biten gibi kullanın .
Bu, bir gecikmeden sonra alt süreci öldürmek için arka plan zaman aşımı işlemini kullanan diğer yanıtlara benzer. Bence bu Dan'ın uzatılmış cevabı ( https://stackoverflow.com/a/5161274/1351983 ) ile hemen hemen aynı , ancak zaman aşımı kabuğu zaten sona ermişse öldürülmeyecek.
Bu program sona erdikten sonra, devam eden birkaç "uyku" işlemi devam edecek, ancak bunlar zararsız olmalıdır.
Bu, diğer cevabımdan daha iyi bir çözüm olabilir, çünkü taşınabilir olmayan kabuk özelliğini read -t
kullanmaz ve kullanmaz pgrep
.