Peringatan ketika RAM yang tersedia mendekati nol

13

Ini adalah kelanjutan dari solusi pembatas Memori untuk aplikasi serakah yang dapat merusak OS? : ulimit dan cgroups tidak ramah pengguna, dan selain itu, tidak akan berfungsi dengan aplikasi yang menelurkan proses terpisah, seperti Chrome / Chromium untuk setiap tab (grup) baru.

Solusi sederhana dan efektif, yang digunakan oleh Windows 7 sebenarnya, adalah untuk memperingatkan pengguna bahwa OS kehabisan memori. Pop-up peringatan sederhana ini telah mencegah saya dari membeku sistem yang disebabkan oleh memori rendah di Windows, sementara saya terus berlari ke mereka di distro Ubuntu yang saya uji langsung (di mana disk yang dipasang RAM akan memakan 2GB saja).

Jadi, apakah ada cara untuk secara otomatis memperingatkan pengguna bahwa RAM yang tersedia mendekati nol, tanpa pengguna harus mengawasi beberapa gadget pemantauan memori? Tentunya Conky dapat dikonfigurasi untuk melakukan itu?

Dan Dascalescu
sumber
2
Empat tahun kemudian , sepertinya memeriksa secara berkala free -madalah jalan yang harus ditempuh.
Dan Dascalescu

Jawaban:

8

Periksa skrip ini: Memerlukan aplikasi / skrip yang mengingatkan ketika memori sistem hampir habis

#!/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();
?>
Spesifikasi Standar
sumber
1
Script bekerja dengan adaptasi kecil (saya baru saja menggunakan available=$(free -m | grep Mem | awk '{print $7}')). Untuk membuat pemberitahuan-kirim bekerja dengan cron, lihat anmolsinghjaggi.wordpress.com/2016/05/11/…
morsch
Jika bahasa tersebut bukan bahasa Inggris, maka bebas akan menampilkan teks yang dilokalkan dan penguraian gagal. Kemudian tambahkan LANG=en_US.UTF-8di awal skrip bash.
Freddi Schiller
2

Skrip lain yang saya tulis untuk tujuan ini:

#!/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
Mikko Rantalainen
sumber
Mengapa o mengapa notify-sendmengabaikan parameter batas waktu : - / Dan mengapa tidak ada dokumentasi tentang apa kategori dan ikon persediaan? Juga, baris baru diabaikan dan pesan terpotong . -u criticalmemecahkan itu.
Dan Dascalescu
Secara teknis notify-sendtidak mengabaikan batas waktu. Ini adalah proses yang mengambil pemberitahuan sebagai input dan menampilkannya di atas desktop yang memutuskan untuk mengabaikan batas waktu. Lihat juga: unix.stackexchange.com/q/251243/20336
Mikko Rantalainen
1

Versi terbaru dari skrip yang berfungsi dengan bebas dari 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
Jirka Hladky
sumber
1

Skrip yang diperbarui di atas juga untuk menambahkan detail pada 3 proses yang haus memori. Lihat di https://github.com/romanmelko/ubuntu-low-mem-popup

Ini skripnya sendiri:

#!/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
Roman Melko
sumber
Terima kasih atas kontribusinya. Praktik yang lebih baik di sini adalah untuk meringkas (dalam hal ini salinan) konten dari tautan yang Anda rujuk. Dengan cara ini, jawaban Anda tetap valid bahkan jika tautannya hilang.
Marc Vanhoomissen
1

Varian menggunakan RAM yang tersedia , persentase dan menampilkan pemberitahuan desktop ketika dipanggil oleh cron (yaitu skrip loop tidak harus dimulai setelah reboot):

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