3 Alternatives #
. systemd-timer
. earlyoom-style
.
3 while-loop #
check_mem_and_kill_falkon () {
avail=$(free -h | awk '/Mem:/ {print $7}')
if [[ $avail == *Gi ]]; then
avail_mi=$(echo "${avail%Gi}" | awk '{printf "%d", $1 * 1024}')
else
avail_mi=$(echo "${avail%Mi}" | awk '{printf "%d", $1}')
fi
if (( avail_mi < 200 )); then
killall falkon 2>/dev/null
fi
}
while true; do
check_mem_and_kill_falkon
sleep 10
done
bash memwatch.sh &
.
3 Faster + more robust: No floating point, no sed #
1while true; do
2 free | awk '/Mem:/ {exit ($7 < 200*1024)}' && killall falkon 2>/dev/null
3 sleep 10
4done
nohup bash ~/memwatch.sh >/dev/null 2>&1 &
.
3 W/ stdout : Option 1: #
1Threshold=200
2
3while true; do
4 free | awk '/Mem:/ {print "Threshold: " (200*1024) ". Available: " $7 ". Diff = " $7-(200*1024)}'
5 #print "Threshold: %s" '$(200*1024)'
6
7 free | awk '/Mem:/ {exit ($7 < 200*1024)}'
8 #&& killall falkon 2>/dev/null
9 sleep 2
10done
11
12echo "Threshold: 204800. Available:s 2311660. Diff = 2106860"
13
.
3 W/ stdout : Option 2: Single awk, no variable, one free call #
1while true; do
2 free | awk '
3 /Mem:/ {
4 avail_kb=$7
5 if (avail_kb > 1024*1024)
6 printf "Available: %.2f GiB\n", avail_kb/1024/1024
7 else
8 printf "Available: %.0f MiB\n", avail_kb/1024
9
10 exit (avail_kb < 200*1024)
11 }
12 ' && killall falkon 2>/dev/null
13 sleep 10
14done
.
3 W/ stdout : Option 3: Timestamped output (nice for logs) #
. No persistent variable . Recalculated every iteration . Human-readable output to stdout . Action triggered on threshold
. pass shell variables into awk via '-v' !!!!!!!!
1_threshold=200
2
3while true; do
4 free | awk -v threshold="$_threshold" '
5 /Mem:/ {
6 printf "%s Threshold: %d. Free = %.0f\n",
7 strftime("%T"), threshold, $7/1024
8 exit ($7 < threshold*1024)
9 }
10 ' && killall falkon 2>/dev/null
11 sleep 2
12done
13
last updated:
