Đây là một nỗ lực nhằm tránh làm chết một tiến trình sau khi nó đã thoát, điều này làm giảm cơ hội giết một tiến trình khác có cùng ID tiến trình (mặc dù có lẽ không thể tránh được loại lỗi này hoàn toàn).
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
)
}
Sử dụng like run_with_timeout 3 sleep 10000
, chạy sleep 10000
nhưng kết thúc sau 3 giây.
Điều này giống như các câu trả lời khác sử dụng quy trình hết thời gian nền để giết tiến trình con sau khi trì hoãn. Tôi nghĩ rằng điều này gần giống với câu trả lời mở rộng của Dan ( https://stackoverflow.com/a/5161274/1351983 ), ngoại trừ lớp vỏ thời gian chờ sẽ không bị giết nếu nó đã kết thúc.
Sau khi chương trình này kết thúc, vẫn còn một vài quá trình "ngủ" kéo dài, nhưng chúng sẽ vô hại.
Đây có thể là một giải pháp tốt hơn câu trả lời khác của tôi vì nó không sử dụng tính năng vỏ không di động read -t
và không sử dụng pgrep
.