Kullanılabilir RAM sıfıra yaklaştığında uyarı


13

Bu OS çökebilir açgözlü uygulamalar için Bellek sınırlama çözümleri bir takip ? : ulimit ve grup grupları kullanıcı dostu değildir ve ayrıca her yeni (grup) sekme için Chrome / Chromium gibi ayrı işlemler oluşturan uygulamalarla çalışmaz.

Windows 7 tarafından kullanılan basit ve etkili çözüm, kullanıcıyı işletim sisteminin belleği azaldığı konusunda uyarmaktır. Bu basit uyarı pop-up'ı, Windows'ta düşük bellek nedenli bir sistem donmasına neden olmamı engellerken, canlı olarak test ettiğim Ubuntu dağıtımlarında (RAM'e takılı diskin sadece 2GB yiyeceği) çalıştım.

Peki, kullanıcı bazı bellek izleme aracına göz kulak olmak zorunda kalmadan, kullanılabilir RAM sıfıra yaklaştığında kullanıcıyı otomatik olarak uyarmanın bir yolu var mı? Elbette Conky bunu yapacak şekilde yapılandırılabilir mi?


2
Dört yıl sonra , periyodik olarak kontrol free -metmenin yolu budur.
Dan Dascalescu

Yanıtlar:


8

Şu komut dosyalarını kontrol edin: Sistem belleği tükenirken uygulama / komut dosyası uyarısı gerekiyor

#!/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
Senaryo küçük uyarlamalar ile çalışır (az önce kullandım available=$(free -m | grep Mem | awk '{print $7}')). Cron ile bildir-gönderme çalışması yapmak için bkz. Anmolsinghjaggi.wordpress.com/2016/05/11/…
morsch

Dil İngilizce değilse, ücretsiz yerelleştirilmiş metin çıktılar ve ayrıştırma başarısız olur. Sonra LANG=en_US.UTF-8bash komut dosyasının başlangıcına ekleyin .
Freddi Schiller

2

Bu amaçla yazdığım başka bir senaryo:

#!/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

Neden o notify-sendzaman aşımı parametresini görmezden geliyor : - / Peki neden kategorilerin ve hisse senedi simgelerinin ne olduğuna dair bir belge yok? Ayrıca, yeni satırlar yoksayılır ve ileti kesilir . -u criticalbunu çözer.
Dan Dascalescu

Teknik notify-sendolarak zaman aşımı göz ardı edilmez. Bildirimi girdi olarak alan ve zaman aşımını yok saymaya karar veren masaüstünün üzerinde görüntüleyen işlemdir. Ayrıca bakınız: unix.stackexchange.com/q/251243/20336
Mikko

1

Procps-ng 3.3.10'dan ücretsiz olarak çalışan komut dosyasının güncellenmiş sürümü

#!/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

Ayrıca belleğe aç ilk 3 işlem hakkında ayrıntılar eklemek için komut dosyasının üzerinde güncellendi. Bkz. Https://github.com/romanmelko/ubuntu-low-mem-popup

İşte betiğin kendisi:

#!/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

Katkınız için teşekkür ederiz. Buradaki daha iyi uygulama, başvurduğunuz bağlantının içeriğini özetlemektir (bu durumda kopyalamak). Bu şekilde, bağlantınız kaybolsa bile yanıtınız geçerliliğini korur.
Marc Vanhoomissen

1

Kullanılabilir RAM kullanan varyant , yüzdeler ve cron tarafından çağrıldığında masaüstü bildirimlerini görüntüler (yani, döngü komut dosyasının yeniden başlatıldıktan sonra başlatılması gerekmez):

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.