為什麼我的腳本慢慢地使用越來越多的記憶體?是因為midori嗎?
我做了一個腳本來無限循環顯示各種網站,並註意到系統正在慢慢消耗越來越多的記憶體。否則該腳本可以完美執行。
根據我從
top
命令中收集到的資訊,我相信它midori
(網際網路瀏覽器)正在消耗所有(嗯,至少很大一部分)記憶體。我midori
的配置為打開目前選項卡中的所有頁面,因此只有一個midori
正在執行的實例並且只有一個選項卡打開,但它仍然繼續增加它的記憶體使用量。#Start VNC Server x11vnc -display :0 -usepw -listen ip_addr & #Sites to display SITES=( "a bunch of urls here..." ) #Display Time (In Seconds) TIME=( 125 35 35 35 35 35 20 20 20 20 20 20 20 20 20 30 ) #Open the browser and enter fullscreen mode midori http://google.com & sleep 15 xdotool key F11 #Infinite Loop while [ 1 -eq 1 ]; do #Loop through each site for ((i=0;i<${#SITES[@]};++i)); do #Open the site midori ${SITES[i]} & #Check to see if the site has a display time set in the TIME variable if [ -z ${TIME[i]} ]; then #If the display time is not set, display for 30 seconds sleep 30 else #Display for the appropriate amount of time sleep ${TIME[i]} fi done done
有任何想法嗎?謝謝。
編輯:
值得一提的是,當我說它“慢慢地”使用更多記憶體時,我的意思是非常緩慢;執行腳本約 7 小時後,記憶體消耗從 35% 變為 61%。
Web 瀏覽器是臭名昭著的記憶體豬和記憶體洩漏者,特別是如果他們正在查看的頁面有任何 javascript。這只是他們本性的一部分。除了可能的文本模式瀏覽器
lynx
,我認為我從未見過隨著時間的推移不會洩漏記憶體的瀏覽器。在顯示最後一個選項卡後,您是否需要瀏覽器留在螢幕上?如果不是,則
pkill midori
介於兩done
行之間。如果你這樣做,那麼pkill midori ; midori ${SITES[i]} &
。或者,在for
循環中:[ "$i" == "${#SITES[@]}" ] && pkill midori
就在執行之前midori
。或從 0 循環到 $ ((" $ {#SITES$$ @ $$" - 1)),然後在第一個
done
. 或者,可能是最簡單的,就pkill midori
在while
語句之後(如果 midori 沒有執行,則不會列印任何錯誤消息,除非您使用 執行,否則不會發生任何事情set -e
)。如果您沒有
pkill
安裝(它procps
在 debian 和 raspbian 的軟體包中),您可以在 midori 程序被殺死和重新啟動時擷取它的 PID,並殺死該特定 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
這不僅讓任何新的midori 程序
$!
的 PID 啟動(是最近的後台作業的 PID),它還檢查它是否已經啟動。如果 midori 由於任何原因未能執行,則它會退出並顯示錯誤消息。如果您沒有在 rpi 上執行,則可以在可能的情況下為系統添加更多 RAM。這是提高系統性能和響應能力的一種相當便宜的方法,核心將使用任何“未使用”的 RAM 來記憶體磁碟。
我寫了一個你可能會覺得有用的腳本,呼叫
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 而沒有其他用途。chromium 和 firefox 用於隨機瀏覽我感興趣的東西。
chromium
是真正的豬。目前它只使用了 10GB,但那是因為我幾個小時前因為升級而重新啟動了它(在那之前大約是 14GB)。同樣firefox
,它通常在 4-6GB 左右。但我讓它們一次執行數週或數月,每個視窗有十幾個或三個選項卡,每個視窗有 20 個或更多視窗。每個視窗都主要針對我正在閱讀的特定主題。看到特別使用了多少鉻,我有點驚恐……然後我想“將我的 RAM 翻倍到 32GB 只需 100 美元”。現在我真的不在乎。如果我的主機板是 DDR4 或者 32GB DDR3 DIMM 不是不合理的貴,我會升級到 64GB。
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]; }