Cảnh báo khi RAM khả dụng gần bằng không


13

Đây là một giải pháp hạn chế bộ nhớ tiếp theo cho các ứng dụng tham lam có thể làm sập hệ điều hành? : ulimit và cgroups không thân thiện với người dùng và bên cạnh đó, sẽ không hoạt động với các ứng dụng sinh ra các quy trình riêng biệt, chẳng hạn như Chrome / Chromium cho mỗi tab (nhóm) mới.

Giải pháp đơn giản và hiệu quả, được Windows 7 sử dụng thực sự, là để cảnh báo người dùng rằng HĐH sắp hết bộ nhớ. Cửa sổ bật lên cảnh báo đơn giản này đã ngăn tôi không bị đóng băng hệ thống do bộ nhớ thấp trong Windows, trong khi tôi tiếp tục chạy chúng trên các bản phân phối Ubuntu mà tôi đang kiểm tra trực tiếp (trong đó đĩa gắn RAM sẽ ăn hết 2GB).

Vì vậy, có cách nào để tự động cảnh báo người dùng rằng RAM khả dụng gần bằng không, mà người dùng không phải để mắt đến một số tiện ích theo dõi bộ nhớ? Chắc chắn Conky có thể được cấu hình để làm điều đó?


2
Bốn năm sau , có vẻ như kiểm tra định kỳ free -mlà con đường để đi.
Dan Dascalescu

Câu trả lời:


8

Kiểm tra các tập lệnh này: Cần cảnh báo ứng dụng / tập lệnh khi bộ nhớ hệ thống sắp hết

#!/bin/bash

#Minimum available memory limit, MB
THRESHOLD=400

#Check time interval, sec
INTERVAL=30

while :
do

    free=$(free -m|awk '/^Mem:/{print $4}')
    buffers=$(free -m|awk '/^Mem:/{print $6}')
    cached=$(free -m|awk '/^Mem:/{print $7}')
    available=$(free -m | awk '/^-\/+/{print $4}')

    message="Free $free""MB"", buffers $buffers""MB"", cached $cached""MB"", available $available""MB"""

    if [ $available -lt $THRESHOLD ]
        then
        notify-send "Memory is running out!" "$message"
    fi

    echo $message

    sleep $INTERVAL

done

PHP:

#!/usr/bin/php
<?php
$alert_percent=($argc>1)?(int)$argv[1]:90;
//$interval=($argc>2):(int)$argv[2]:25;



//while(true)
//{
 exec("free",$free);

$free=implode(' ',$free);
preg_match_all("/(?<=\s)\d+/",$free,$match);

list($total_mem,$used_mem,$free_mem,$shared_mem,$buffered_mem,$cached_mem)=$match[0];

$used_mem-=($buffered_mem+$cached_mem);

$percent_used=(int)(($used_mem*100)/$total_mem);

if($percent_used>$alert_percent)
exec("notify-send 'Low Memory: $percent_used% used'");

//sleep($interval);
//}
exit();
?>

1
Kịch bản hoạt động với các điều chỉnh nhỏ (tôi chỉ sử dụng available=$(free -m | grep Mem | awk '{print $7}')). Để thực hiện công việc gửi thông báo với cron, hãy tham khảo anmolsinghjaggi.wordpress.com/2016/05/11/ mẹo
morsch

Nếu ngôn ngữ không phải là tiếng Anh, miễn phí sẽ xuất văn bản cục bộ và phân tích cú pháp không thành công. Sau đó thêm LANG=en_US.UTF-8vào lúc bắt đầu của tập lệnh bash.
Freddi Schiller

2

Một kịch bản khác mà tôi đã viết cho mục đích này:

#!/bin/bash
# Copyright 2019, Mikko Rantalainen
# License: MIT X License

# Minimum available memory until warning, default to 10% of total RAM (MiB)
THRESHOLD=$(grep "MemTotal:" /proc/meminfo | awk '{ printf "%d", 0.1*$2/1024}')
INTERVAL=60s

echo "Emitting a warning if less than $THRESHOLD MiB of RAM is available..."

while true; do
    meminfo=$(cat /proc/meminfo)
    free=$(echo "$meminfo" | grep "MemFree:" | awk '{ printf "%d", $2/1024}')
    available=$(echo "$meminfo" | grep "MemAvailable:" | awk '{ printf "%d", $2/1024}')
    inactive=$(echo "$meminfo" | grep "Inactive:" | awk '{ printf "%d", $2/1024}')
    reclaimable=$(echo "$meminfo" | grep "SReclaimable:" | awk '{ printf "%d", $2/1024}')
    usable=$(echo "$free + $inactive / 2 + $reclaimable / 2" | bc)
    if test -z "$available"; then
        message="Current kernel does not support MemAvailable in /proc/meminfo, aborting"
        notify-send "Error while monitoring low memory" "$message"
        echo "$message" 1>&2
        exit 1
    fi

    message="Available: $available MiB
Free: $free MiB
Maybe usable: $usable MiB"

    if [ "$available" -lt "$THRESHOLD" ]
        then
        notify-send -u critical "Low memory warning" "$message"
        echo "Low memory warning:"
    echo "$message"
    fi

    #echo "DEBUG: $message"
    sleep $INTERVAL
done

Tại sao o tại sao lại notify-sendbỏ qua tham số thời gian chờ : - / Và tại sao không có tài liệu nào về các danh mục và biểu tượng chứng khoán là gì? Ngoài ra, các dòng mới được bỏ qua và tin nhắn sẽ bị cắt ngắn . -u criticalgiải quyết nó
Dan Dascalescu

Về mặt kỹ thuật notify-sendkhông bỏ qua thời gian chờ. Đó là quá trình lấy thông báo làm đầu vào và hiển thị nó phía trên màn hình nền quyết định bỏ qua thời gian chờ. Xem thêm: unix.stackexchange.com/q/251243/20336
Mikko Rantalainen

1

Phiên bản cập nhật của tập lệnh hoạt động miễn phí từ Procps-ng 3.3.10

#!/bin/bash

#Minimum available memory limit, MB
THRESHOLD=400

#Check time interval, sec
INTERVAL=30

while :
do
    free_out=$(free -w -m)
    available=$(awk '/^Mem:/{print $8}' <<<$free_out)

    if (( $available < $THRESHOLD ))
        then
        notify-send -u critical "Memory is running out!" "Available memory is $available MiB"
        echo "Warning - available memory is $available MiB"    
    fi

    cat <<<$free_out
    sleep $INTERVAL
done

1

Đã cập nhật tập lệnh ở trên để thêm chi tiết về 3 quy trình đói bộ nhớ hàng đầu. Xem tại https://github.com/romanmelko/ubfox-low-mem-popup

Đây là kịch bản:

#!/usr/bin/env bash

set -o errexit
set -o pipefail
set -o nounset

# If the language is not English, free will output localized text and parsing fails
LANG=en_US.UTF-8

THRESHOLD=500
INTERVAL=300
POPUP_DELAY=999999

# sleep some time so the shell starts properly
sleep 60

while :
do
    available=$(free -mw | awk '/^Mem:/{print $8}')
    if [ $available -lt $THRESHOLD ]; then
        title="Low memory! $available MB available"
        message=$(top -bo %MEM -n 1 | grep -A 3 PID | awk '{print $(NF - 6) " \t" $(NF)}')
        # KDE Plasma notifier
        kdialog --title "$title" --passivepopup "$message" $POPUP_DELAY
        # use the following command if you are not using KDE Plasma, comment the line above and uncomment the line below
        # please note that timeout for notify-send is represented in milliseconds
        # notify-send -u critical "$title" "$message" -t $POPUP_DELAY
    fi
    sleep $INTERVAL
done

Cảm ơn bạn đã đóng góp. Thực hành tốt hơn ở đây là tóm tắt (trong trường hợp này là sao chép) nội dung của liên kết bạn đề cập đến. Bằng cách này, câu trả lời của bạn vẫn hợp lệ ngay cả khi liên kết biến mất.
Marc Vanhoomissen

1

Biến thể sử dụng RAM có sẵn , tỷ lệ phần trăm và hiển thị thông báo trên màn hình khi được gọi bằng cron (tức là tập lệnh vòng lặp không phải bắt đầu sau khi khởi động lại):

#!/usr/bin/env bash

# dbus env var required when called via cron:
eval "export $(egrep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -u $LOGNAME gnome-session)/environ | tr '\0' '\n')";

AVAIL_THRESHOLD=5

free_output=$(free)
mem_total=$(awk '/^Mem:/{print $2}' <<< $free_output)
mem_avail=$(awk '/^Mem:/{print $7}' <<< $free_output)
mem_avail_m=$(bc <<< "scale=1; $mem_avail/1024")
percent_avail=$(bc <<< "scale=1; $mem_avail*100 /$mem_total")
should_warn=$(bc <<< "$percent_avail < $AVAIL_THRESHOLD")

if (( $should_warn )); then
    notify-send "Memory warning - only $percent_avail% ($mem_avail_m MB) available"
else
    echo "Memory OK - $percent_avail% ($mem_avail_m MB) available"
fi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.