Đây là những gì tôi đang tìm kiếm và đã sử dụng nó một thời gian (thay đổi một chút). Gần đây, tôi đã đặt một lỗi trong công việc của mình nhưng cần phải duy trì ứng dụng (máy chủ trò chơi).
Tôi đã trích dẫn phần mà PID bị giết cao nhất, vì nó đã giết chết PID sai.
Đây là bản thảo mới nhất của tôi về kịch bản của bạn, cho đến nay, nó tìm thấy sự quá tải hàng đầu và giết chết nó một cách hiệu quả (cũng gửi email cho tôi với thông tin bất cứ khi nào nó làm bất cứ điều gì);
#!/bin/bash
## Note: will kill the top-most process if the $CPU_LOAD is greater than the $CPU_THRESHOLD.
echo
echo checking for run-away process ...
CPU_LOAD=$(uptime | cut -d"," -f4 | cut -d":" -f2 | cut -d" " -f2 | sed -e "s/\.//g")
CPU_THRESHOLD=300
PROCESS=$(ps aux r)
TOPPROCESS=$(ps -eo pid -eo pcpu -eo command | sort -k 2 -r | grep -v PID | head -n 1)
if [ $CPU_LOAD -gt $CPU_THRESHOLD ] ; then
# kill -9 $(ps -eo pid | sort -k 1 -r | grep -v PID | head -n 1) #original
# kill -9 $(ps -eo pcpu | sort -k 1 -r | grep -v %CPU | head -n 1)
kill -9 $TOPPROCESS
echo system overloading!
echo Top-most process killed $TOPPROCESS
echo load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r
# send an email using mail
SUBJECT="Runaway Process Report at Marysol"
# Email To ?
EMAIL="myemail@somewhere.org"
# Email text/message
EMAILMESSAGE="/tmp/emailmessage.txt"
echo "System overloading, possible runaway process."> $EMAILMESSAGE
echo "Top-most process killed $TOPPROCESS" >>$EMAILMESSAGE
echo "Load average was at $CPU_LOAD" >>$EMAILMESSAGE
echo "Active processes..." >>$EMAILMESSAGE
echo "$PROCESS" >>$EMAILMESSAGE
mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE
else
echo
echo no run-aways.
echo load average is at $CPU_LOAD
echo
echo Active processes...
ps aux r
fi
exit 0
Kịch bản nhỏ này cực kỳ hữu ích, nếu bạn không thích nó giết bất kỳ quy trình nào, chỉ riêng email sẽ giúp bạn thông báo.