これは OSをクラッシュさせる可能性のある欲張りなアプリケーションのメモリ制限ソリューション? :ulimitとcgroupsはユーザーフレンドリーではなく、さらに、次のような個別のプロセスを生成するアプリケーションでは動作しません。新しい(グループの)タブごとにChrome/Chromium。
Windows 7で実際に使用されるシンプルで効果的なソリューションは、OSのメモリが不足していることをユーザーに警告することです。この単純な警告ポップアップにより、Windowsでメモリ不足が原因でシステムがフリーズするのを防ぐことができましたが、ライブでテストしているUbuntuディストリビューションで実行し続けました(RAMマウントされたディスクは2GBのみを消費します)。
だから、ユーザーがいくつかのメモリ監視ガジェットに目を向ける必要なく、利用可能なRAMがゼロに近づいていることをユーザーに自動的に警告する方法はありますか?確かに Conky はそのように設定できますか?
これらのスクリプトを確認してください: システムメモリが不足しているときにアプリケーション/スクリプトのアラートが必要
#!/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();
?>
この目的のために書いた別のスクリプト:
#!/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
RAM availableを使用したバリアント、==、パーセンテージ、およびcronによって呼び出されたときにデスクトップ通知を表示します(つまり、再起動後にループスクリプトを開始する必要はありません)。
#!/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
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
上記のスクリプトを更新して、メモリを大量に消費する上位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