जब उपलब्ध रैम शून्य पहुंचता है तो चेतावनी


13

यह एक अनुवर्ती करने के लिए है मेमोरी लालची अनुप्रयोगों है कि ओएस कुचल सकता है के लिए समाधान सीमित? • ulimit और cgroups उपयोगकर्ता के अनुकूल नहीं हैं, और इसके अलावा, उन अनुप्रयोगों के साथ काम नहीं करेंगे जो प्रत्येक नए (समूह के) टैब के लिए क्रोम / क्रोमियम जैसे अलग-अलग प्रक्रियाओं को स्पॉन करते हैं।

विंडोज 7 द्वारा वास्तव में उपयोग किया जाने वाला सरल और प्रभावी समाधान, उपयोगकर्ता को चेतावनी देना है कि ओएस मेमोरी पर कम चल रहा है। इस साधारण चेतावनी पॉप-अप ने मुझे विंडोज में किसी भी कम-मेमोरी-कारण प्रणाली को फ्रीज करने से रोक दिया है, जबकि मैं उबंटू डिस्ट्रोस पर उनमें भाग रहा था कि मैं लाइव परीक्षण कर रहा था (जहां रैम-माउंटेड डिस्क अकेले 2 जीबी खाएगी)।

तो, क्या उपयोगकर्ता को स्वचालित रूप से चेतावनी देने का कोई तरीका है कि उपलब्ध रैम शून्य के पास है, उपयोगकर्ता को कुछ मेमोरी मॉनिटरिंग गैजेट पर नजर रखने के बिना? निश्चित रूप से कॉन्की को ऐसा करने के लिए कॉन्फ़िगर किया जा सकता है?


2
चार साल बाद , समय-समय पर जाँच की तरह लग रहा free -mहै कि जाने का रास्ता है।
Dan Dascalescu

जवाबों:


8

इन स्क्रिप्ट्स की जाँच करें: सिस्टम मेमोरी के रन आउट होने पर एप्लिकेशन / स्क्रिप्ट को अलर्ट करने की आवश्यकता है

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

पीएचपी:

#!/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
स्क्रिप्ट छोटे रूपांतरों के साथ काम करती है (मैंने अभी उपयोग किया है available=$(free -m | grep Mem | awk '{print $7}'))। क्रोन के साथ सूचित-भेजने का काम करने के लिए, anmolsinghjaggi.wordpress.com/2016/05/11/…
morsch

अगर भाषा अंग्रेजी नहीं है, तो मुफ्त में स्थानीयकृत पाठ और पार्सिंग विफल हो जाएगा। फिर LANG=en_US.UTF-8बैश स्क्रिप्ट की शुरुआत में जोड़ें ।
फ्रेडी शिलर

2

एक और स्क्रिप्ट जो मैंने इस उद्देश्य के लिए लिखी है:

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

O o notify-sendटाइमआउट पैरामीटर की उपेक्षा क्यों करता है : - / और श्रेणियों और स्टॉक आइकन क्या हैं, इसके बारे में कोई प्रलेखन क्यों नहीं है? साथ ही, नई कहानियों को नजरअंदाज कर दिया जाता है और संदेश को काट दिया जाता है । -u criticalहल करती है।
डैन डस्केल्सस्कु

तकनीकी notify-sendरूप से टाइमआउट की अनदेखी नहीं करता है। यह वह प्रक्रिया है जो नोटिफ़िकेशन को इनपुट के रूप में लेती है और इसे डेस्कटॉप के ऊपर प्रदर्शित करती है जो टाइमआउट को अनदेखा करने का निर्णय लेती है। इसे भी देखें: unix.stackexchange.com/q/251243/20336
मिकको रैंटलैनेन

1

स्क्रिप्ट का अपडेट किया गया संस्करण जो 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

शीर्ष 3 मेमोरी-भूख प्रक्रियाओं पर विवरण जोड़ने के लिए स्क्रिप्ट के ऊपर अद्यतन। Https://github.com/romanmelko/ubuntu-low-mem-popup पर देखें

यहाँ स्क्रिप्ट ही है:

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

योगदान के लिए धन्यवाद। यहां बेहतर अभ्यास यह है कि आप इस लिंक की सामग्री को संक्षेप में (इस मामले की प्रतिलिपि में) देखें। इस तरह, लिंक गायब होने पर भी आपका उत्तर मान्य रहता है।
मार्क वॉनहोमिसन

1

क्रॉन द्वारा कॉल किए जाने पर रैम उपलब्ध , प्रतिशत का उपयोग करता है और डेस्कटॉप सूचनाओं को प्रदर्शित करता है (यानी रिबूट के बाद लूप स्क्रिप्ट शुरू नहीं होती है):

#!/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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.