Веб-браузеры - печально известные свиньи памяти и утечки памяти, особенно если просматриваемые ими страницы содержат какой-либо javascript. Это просто часть их натуры. Если не считать браузеров с текстовым режимом, таких как lynx
, я не думаю, что когда-либо видел, чтобы не пропускал бы утечку памяти с течением времени.
Требуется ли, чтобы браузер оставался на экране после отображения последней вкладки? Если нет, то pkill midori
между двумя строками done
. Если да, то pkill midori; midori $ {САЙТЫ [i]} и
. Или в цикле for
: ["$ i" == "$ {# SITES [@]}"] && pkill midori
непосредственно перед запуском midori
. или цикл от 0 до $ (("$ {# SITES [@]" - 1)), затем уничтожение и запуск финального мидори после первого done
.
Или, возможно, самый простой, просто pkill midori
сразу после оператора while
(если midori не запущен, сообщение об ошибке не выводится, и ничего не происходит, если вы работает с set -e
).
Если у вас не установлен pkill
(он находится в пакете procps
в debian и raspbian), вы можете захватить PID процесса midori всякий раз, когда он будет убит и перезапущен , и убейте этот конкретный PID. например
while [ 1 ]; do
mPID=0
for ((i=0;i<"${#SITES[@]}";++i)); do
midori "${SITES[i]}" &
[ "$mPID" -eq 0 ] && [ -n "$(jobs -n)" ] && mPID=$!
[ "$mPID" -eq 0 ] && echo "couldn't start midori" && exit 1
# sleep for for display time if set, otherwise 30 secs.
[ -n "${TIME[i]}" ] && sleep "${TIME[i]}" || sleep 30
done
kill "$mPID"
done
Это не только получает PID любого нового запущенного процесса midori ( $!
- это PID самого последнего фонового задания), но и проверяет, был ли он запущен . Если midori не удалось запустить по какой-либо причине, он выйдет с сообщением об ошибке.
Если бы вы не работали с rpi, вы могли бы добавить в свою систему больше ОЗУ, если это вообще возможно. Это довольно дешевый способ повысить производительность и скорость отклика системы, и любая «неиспользуемая» оперативная память будет использоваться ядром для кэширования ваших дисков.
Я написал сценарий, который может вам пригодиться, под названием mem-pigs.sh
, чтобы подсчитать использование памяти указанными программами. по умолчанию используются браузеры, которые я использую регулярно (потому что они потребляют много памяти).
#! /bin/bash
# print total RSS memory usage for program(s) with multiple pids
# set default if no args
[ -z "$1" ] && set -- chromium firefox midori
for p in "$@" ; do
printf "%s:\t%s %s\n" "$p" $(
( printf '1024*(%s)\n' \
$(awk '
BEGIN {if (ARGC==1) { print 0 ; exit } };
/VmRSS:/ {print $2}
' \
$(pgrep "$p" | sed -e 's:^:/proc/:;s:$:/status:') |
paste -sd+)
) |
bc |
human-numbers.pl)
done
пример вывода:
$ mem-pigs.sh
chromium: 9.81 GiB
firefox: 1.39 GiB
midori: 2.76 GiB
midori
, вероятно, использовал бы больше, если бы я использовал его как браузер общего назначения, но я использую его исключительно для facebook и ни для чего другого. Chrome и Firefox для случайного просмотра интересующих меня вещей.
Хром
- настоящая свинья. на данный момент он использует только 10 ГБ, но это потому, что я перезапустил его несколько часов назад из-за обновления (до этого было около 14 ГБ). то же самое для firefox
, обычно это около 4-6 ГБ. Но я оставляю их работать на несколько недель или месяцев одновременно с дюжиной или тремя вкладками в каждом окне в 20 или более окнах в каждом.каждое окно в основном посвящено определенной теме, о которой я читаю.
Я был в ужасе, увидев, сколько конкретно хрома было использовано ... потом я подумал, что «удвоение моей оперативной памяти до 32 ГБ - это всего лишь 100 долларов». теперь мне все равно. Я бы увеличил объем памяти до 64 ГБ, если бы моя материнская плата была DDR4 или 32 ГБ DDR3 DIMMS не были неоправданно дорогими.
mem-pigs.sh
использует другой скрипт, human-numbers.pl
:
#! /usr/bin/perl
use strict;
use warnings;
my $units = 1024;
my @suffixes=map { $_ ne 'B' && $_ } qw(B KiB MiB GiB TiB PiB EiB ZiB YiB);
if ( (@ARGV) && (($ARGV[0] eq '--si') || ($ARGV[0] eq '-s' )) ) {
shift;
$units = 1000;
@suffixes=map { $_ ne 'B' && $_ } qw(B KB MB GB TB PB EB ZB YB);
};
# Use stdin and/or command-line args as input
# NOTE: command-line args are processed AFTER lines from stdin)
# TODO: option to process args BEFORE STDIN.
my @input = @ARGV;
@ARGV=();
if ( -p STDIN ) {
while (<>) {
push @input, $_;
};
};
my $index=0;
for (@input) {
my $n = $_ ;
my $index = 0;
for (@suffixes) {
last if $n < $units ;
$n = $n / $units;
$index++
};
printf "%.2f %s\n", $n, $suffixes[$index];
}