Требуется предупреждение приложения / сценария, когда заканчивается системная память [дубликат]

Я не буду использовать файл подкачки (из-за какой-то ошибки в ядре или драйвере AMD).

Я не хочу, чтобы какая-то утилита работала и отслеживала свободную системную память и предупреждала меня, когда она становится меньше определенного предела.

Это уведомит меня о том, что мне нужно закрыть некоторые приложения (или вкладки браузера), чтобы избежать зависания системы из-за какой-то странной активности ввода-вывода kswapd0 (возможно, еще одна ошибка).

Есть ли подходящее программное обеспечение?

ОБНОВЛЕНИЕ:

Я переработал сценарий, предоставленный Гэри, для моих нужд и хочу поделиться им

#!/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
1
задан 4 April 2013 в 12:57

2 ответа

Версия PHP сценария:

Свободная память как показано в системном мониторе: Свободный = Общее количество - (Used-buffered-cached)

Каково различие между отчетом об использовании памяти в Системном мониторе и тем свободным?

Примечание: Запускать этот скрипт как использование задания крона:

* * * * *  env DISPLAY=:0.0 path/to/file 90 

или

@restart  env DISPLAY=:0.0 path/to/file

не прокомментируйте цикл с условием продолжения для выполнения его вручную:

Код:

#!/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
ответ дан 4 April 2013 в 12:57

Вы можете попробовать использовать free.

free -s n будет обновлять вывод каждые n секунд. Оберните это в if для любого порога, который, по вашему мнению, используется «слишком много памяти», и отобразите сообщение, когда он достигнет этой точки.

РЕДАКТИРОВАТЬ: Вот сценарий, который я придумал. Грубо, но это работает.

#Checks for low memory.

#!/bin/bash

#cutoff_frac is basically how much used memory can be at in terms of how much
#total memory you have...2 is 1/2 of 100% or an alert when you're using 50% mem, etc.
cutoff_frac=2

total_mem=$(free|awk '/^Mem:/{print $2}')
let "threshold = $total_mem / $cutoff_frac"

while :
do

    free_mem=$(free|awk '/^Mem:/{print $4}')

    if [ $free_mem -lt $threshold ]
        then
        notify-send "Low memory!!"
    fi

    sleep 5

done

exit
0
ответ дан 4 April 2013 в 12:57

Другие вопросы по тегам:

Похожие вопросы: