사용 가능한 RAM이 0에 가까워지면 경고


13

이것은 OS를 중단시킬 수있는 욕심 많은 응용 프로그램에 대한 메모리 제한 솔루션에 대한 후속 조치 입니까? : ulimit 및 cgroup은 사용자에게 친숙하지 않으며 새 탭 그룹마다 Chrome / Chromium과 같은 별도의 프로세스를 생성하는 응용 프로그램에서는 작동하지 않습니다.

실제로 Windows 7에서 사용되는 간단하고 효과적인 솔루션은 사용자에게 OS의 메모리가 부족함을 경고하는 것입니다. 이 간단한 경고 팝업으로 인해 Windows에서 메모리 부족으로 인한 시스템 정지를 막을 수 있었으며 라이브 테스트 중이라는 Ubuntu 배포판에서 계속 실행했습니다 (RAM 마운트 디스크는 2GB 만 소비합니다).

따라서 사용자가 메모리 모니터링 장치를 감시하지 않고도 사용 가능한 RAM이 거의 0에 가깝다는 것을 자동으로 경고하는 방법이 있습니까? 분명히 Conky그렇게 할 수 있습니까?


2
4 년 후 주기적으로 점검하는 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

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
스크립트는 작은 적응으로 작동합니다 (방금 사용했습니다 available=$(free -m | grep Mem | awk '{print $7}')). cron과 함께 통지 보내기 작업을하려면 anmolsinghjaggi.wordpress.com/2016/05/11/…
morsch

언어가 영어가 아닌 경우 free는 현지화 된 텍스트를 출력하고 구문 분석에 실패합니다. 그런 다음 LANG=en_US.UTF-8bash 스크립트의 시작 부분에 추가하십시오 .
Freddi Schiller

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 notify-send타임 아웃 매개 변수를 무시 합니까? 또한 줄 바꿈이 무시되고 메시지가 잘립니다 . -u critical그것을 해결합니다.
Dan Dascalescu

기술적으로 notify-send시간 초과를 무시하지 않습니다. 알림을 입력으로 받아 시간 초과를 무시하기로 결정한 바탕 화면 위에 표시하는 프로세스입니다. 참조 : unix.stackexchange.com/q/251243/20336
미코 Rantalainen

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

기부 해 주셔서 감사합니다. 여기서 더 좋은 방법은 참조하는 링크의 내용을 요약하는 것입니다 (이 경우에는 사본). 이렇게하면 링크가 사라져도 답변이 유효합니다.
Marc Vanhoomissen 2014 년

1

cron에 의해 호출 될 때 RAM 사용 가능 , 백분율 및 변형 데스크탑 알림을 표시하는 변형 (예 : 재부팅 후 루프 스크립트를 시작할 필요가 없음) :

#!/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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.