1

Тема: Утечка памяти

Всем привет

Поставил себе на Keenetic скрипт sdundle. Но со временем он начинает рости в памяти, вытеснять другие приложения в SWAP, как следствие винт начинает лишний раз "дергаться". Гляньте пожалуйста, в чем дело?

#!/bin/sh

UNIDLE=600
SLEEPTIME=3

ctimer=0
cline="";
ti=0
tu=0

while true; do
cat /proc/diskstats | grep "sda " > /var/log/unidle.log
    while read line; do
    if [ "$cline" != "$line" ]; then
        cline=$line
        ctimer=0        
        if [ "$ti" -gt "0" ]; then
            s=`printf "%d:%d:%d\n" $(($ti/60/60%60)) $(($ti/60%60)) $(($ti%60))`
            logger "Clear UnIdle Timer. Timer $s"
            logger "Start_Stop_Count: " `sinfo |grep Start_Stop_Count| awk '{print $10}'`
        logger "Load_Cycle_Count: " `sinfo |grep Load_Cycle_Count| awk '{print $10}'`
            logger "Power_On_Hours: " `sinfo |grep Power_On_Hours| awk '{print $10}'`
            ti=0
        fi
        tu=$(($tu+$SLEEPTIME))
    else
        ctimer=$(($ctimer+$SLEEPTIME))
        if [ "$ctimer" -lt "$UNIDLE" ]; then
            s=`printf "%d:%d:%d\n" $(($ctimer/60/60%60)) $(($ctimer/60%60)) $(($ctimer%60))`
            # logger "Run UnIdle Commnad. Timer $s"
            smartctl -i -d sat /dev/sda 2>/dev/null
            tu=$(($tu+$SLEEPTIME))
        else
            ti=$(($ti+$SLEEPTIME))
            if [ "$tu" -gt "0" ]; then
                s=`printf "%d:%d:%d\n" $(($tu/60/60%60)) $(($tu/60%60)) $(($tu%60))`
                logger "Stopping UnIdle. Timer $s"
                logger "Start_Stop_Count: " `sinfo |grep Start_Stop_Count| awk '{print $10}'`
        logger "Load_Cycle_Count: " `sinfo |grep Load_Cycle_Count| awk '{print $10}'`
                logger "Power_On_Hours: " `sinfo |grep Power_On_Hours| awk '{print $10}'`
                tu=0
            fi
        fi
    fi
    sleep $SLEEPTIME
    done < /var/log/unidle.log
done

P.S. Думаю если что сделать два скрипта, sdunidle1 и sdunidle2, они будут друг друга запускать по очереди. Н это уже заплатка sad

2

Re: Утечка памяти

Nick N., правильно ли я понимаю, что используется smartctl из внешних пакетов? Если да, то попробуйте использовать bash. Будет понятно: busybox течёт или что-либо ещё.

Со всеми вытекающими...

3

Re: Утечка памяти

ryzhov_al :

Будет понятно: busybox течёт или

Можно для начала поменять shebang (первую строку) и переключиться с прошивочного busybox на *ware.

4

Re: Утечка памяти

Спасибо за советы. Но проблема оказалась такая:

вместо строки

smartctl -i -d sat /dev/sda 2>/dev/null

нужно было написать

smartctl -i -d sat /dev/sda >/dev/null

Иначе информация о диске в 5 строчек оставалась в окне SH, где килобайтик за килобайтиком за неделю дорастало мегабайт до 10

Спасибо за наводку по поводу утечки в sh!

5

Re: Утечка памяти

И все равно память в скрипте утекает.  Хоть и не так быстро как и в прошлый раз. Попробую сделать просто перезапуск скрипта сам себя время от времени ...