ต่อไปนี้เป็นความพยายามที่พยายามหลีกเลี่ยงการฆ่ากระบวนการหลังจากที่ออกไปแล้วซึ่งจะช่วยลดโอกาสในการฆ่ากระบวนการอื่นด้วยรหัสกระบวนการเดียวกัน (แม้ว่าอาจเป็นไปไม่ได้ที่จะหลีกเลี่ยงข้อผิดพลาดประเภทนี้)
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://stackoverflow.com/a/5161274/1351983 ) ยกเว้นว่าการหมดเวลาของเชลล์จะไม่ถูกฆ่าถ้ามันสิ้นสุดลงแล้ว
หลังจากโปรแกรมนี้สิ้นสุดลงแล้วจะยังมีกระบวนการ "sleep" ที่ยังทำงานอยู่ แต่จะไม่เป็นอันตราย
นี้อาจจะเป็นทางออกที่ดีกว่าคำตอบอื่น ๆ ของฉันเพราะมันไม่ได้ใช้คุณลักษณะเปลือกไม่ใช่แบบพกพาและไม่ได้ใช้read -t
pgrep