Berikut adalah upaya yang mencoba untuk menghindari membunuh proses setelah itu sudah keluar, yang mengurangi kemungkinan membunuh proses lain dengan ID proses yang sama (walaupun mungkin mustahil untuk menghindari kesalahan semacam ini sepenuhnya).
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
)
}
Gunakan like run_with_timeout 3 sleep 10000, yang berjalan sleep 10000tetapi mengakhirinya setelah 3 detik.
Ini seperti jawaban lain yang menggunakan proses timeout latar belakang untuk membunuh proses anak setelah penundaan. Saya pikir ini hampir sama dengan jawaban diperpanjang Dan ( https://stackoverflow.com/a/5161274/1351983 ), kecuali shell timeout tidak akan dibunuh jika sudah berakhir.
Setelah program ini berakhir, masih akan ada beberapa proses "sleep" yang berjalan, tetapi tidak berbahaya.
Ini mungkin solusi yang lebih baik daripada jawaban saya yang lain karena tidak menggunakan fitur shell non-portabel read -tdan tidak menggunakan pgrep.