Это старая версия документа.


Решение проблем



Лог lighttpd

Это лог непрерывно наращивается и просматривать его через некоторое время становится неудобно. Достаточно добавить ротацию в S50lighttpd.

1) Добавить после определения LOG_D имя файла лога, типа такого (или как-то иначе, по вкусу, как настроен лог)[code]LOG_F=$MOUNT/var/log/$BIN.log[/code]

2) после

    ppp_down)
    ;;

добавить

    rotate)
    echo "Rotate logfile of lighttpd"
    mkdir -p $LOG_D/`date +%Y`/`date +%m`
    mv $LOG_F $LOG_D/`date +%Y`/`date +%m`/`date +%d`.log
    kill -HUP `cat $PID_F`
    ;;

3) заменить строку Usage на

    echo "Usage: $0 {start|stop|restart|status|link_up|link_down|ppp_up|ppp_down|rotate}"

4) теперь остаётся только добавить задание cron запускать «S50lighttpd rotate», например, каждые сутки в 00:00, и в результате получаем красивое разбиение лога по датам:

# lighttpd.log rotate (move to dir /var/log/lighttpd)
0 0 * * * /media/DISK_A1/system/etc/init.d/S50lighttpd rotate

Разумеется, это давным-давно известное решение, но для ротации логов некоторые по привычке ищут logrotate.

См. ниже измененный файл полностью:

#!/bin/sh
# Copyright (C) 2006 OpenWrt.org

MOUNT="/media/DISK_A1/system"
export PATH=$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:/sbin:/usr/sbin:/bin:/usr/bin
export LD_LIBRARY_PATH=$MOUNT/lib:$MOUNT/usr/lib:/lib:/usr/lib

BIN=lighttpd
DEFAULT=$MOUNT/etc/default/$BIN
LOG_D=$MOUNT/var/log/$BIN
LOG_F=$MOUNT/var/log/$BIN.log
RUN_D=$MOUNT/var/run
PID_F=$RUN_D/$BIN.pid
#PORT_F=81
PORT_F=80

daemon_status ()
{
	[ -f $PID_F ] && [ -d /proc/`cat $PID_F` ]
}
 
start_daemon() {
	mkdir -p $LOG_D
	mkdir -p $RUN_D
	$BIN -f $MOUNT/etc/$BIN/$BIN.conf -m $MOUNT/usr/lib/$BIN
	counter=5
	while [ $counter -gt 0 ]
	do
		daemon_status && break
		let counter=counter-1
		sleep 1
	done
	iptables -A INPUT -p tcp --dport $PORT_F -j ACCEPT
}

stop_daemon() {
	kill `cat $PID_F`
	counter=10
	while [ $counter -gt 0 ] 
	do
		daemon_status || break
		let counter=counter-1
		sleep 1
	done
	iptables -D INPUT -p tcp --dport $PORT_F -j ACCEPT 2> /dev/null 
}

case $1 in
	start)
	if daemon_status
	then
		logger -t S50lighttpd "Start - already running"
		echo lighttpd daemon already running
	else
		logger -t S50lighttpd "Start"
		echo Starting lighttpd daemon...
		start_daemon
	fi
	;;
	stop)
	logger -t S50lighttpd "Stop"
	echo Stopping lighttpd daemon...
	stop_daemon
	;;
	restart)
	logger -t S50lighttpd "Restart"
	stop_daemon
	start_daemon
	;;
	status)
	if daemon_status
	then
		echo Running
	else
		echo Not running
	fi
	;;
	link_up)
	;;
	ppp_up)
	;;
	link_down)
	;;
	ppp_down)
	;;
	rotate)
	echo "Rotate logfile of lighttpd"
	mkdir -p $LOG_D/`date +%Y`/`date +%m`
	mv $LOG_F $LOG_D/`date +%Y`/`date +%m`/`date +%d`.log
	kill -HUP `cat $PID_F`
	;;
	*)
	echo "Usage: $0 {start|stop|restart|status|link_up|link_down|ppp_up|ppp_down|rotate}"
	;;
esac

Проблемы с сервером http при медленном установлении соединения с интернет и его разрывами/восстановлениями

При длительном подключении к сети интернет или при разрывах/восстановлении соединения некоторые приложения начинают «дурить». Вот пример записей в журнале, иллюстрирующих проблемы:

Jan 18 00:00:05 device: KEENETIC GIGA II ~ V1.10.B.RU.NDMS ~ 2013-05-28 13:20:04
Jan 18 00:00:05 syslogd started: BusyBox v1.8.2
Jan 18 00:00:05 kernel: klogd started: BusyBox v1.8.2 (2013-05-22 18:54:17 MSK)
Jan 18 00:00:05 kernel: Linux version 2.6.22.15 (developers@ndmsystems.com) (gcc version 4.1.2) #1 SMP Wed May 22 22:21:44 MSK 2013
...
Jan 18 00:00:11 S01swap: Start
Jan 18 00:00:11 kernel: Adding 131064k swap on /media/DISK_A1/system/.swapfile.  Priority:-1 extents:1 across:131064k
Jan 18 00:00:11 S10dropbear: Start
Jan 18 00:00:11 dropbear[625]: Running in background
Jan 18 00:00:11 S12vnstat: Start
Jan 18 00:00:11 S27mysqld: Start
Jan 18 00:00:11 S50lighttpd: Start
Jan 18 00:00:12 S90cron: Start
Jan 18 00:00:12 S99ftpmodificator: Start
Jan 18 00:00:14 kernel: 
...
Jan 18 00:00:18 udhcpc[800]: Sending discover...
Jan 18 00:00:19 Firewall: Start fw.sh
Jan 18 00:00:19 kernel: br0: topology change detected, propagating
...
Jan 18 00:00:20 dnsmasq[1207]: read /etc/hosts - 2 addresses
Jan 18 00:00:20 S99ftpmodificator: Stop
Jan 18 00:00:21 S90cron: Stop
Jan 18 00:00:21 S50lighttpd: Stop
Jan 18 00:00:21 S27mysqld: Stop
Jan 18 00:00:21 S12vnstat: Stop
Jan 18 00:00:21 S10dropbear: Stop
Jan 18 00:00:21 dropbear[625]: Premature exit: Terminated by signal
Jan 18 00:00:21 S01swap: Stop
Jan 18 00:00:21 Firewall: Start fw.sh
Jan 18 00:00:21 S01swap: Start
Jan 18 00:00:21 kernel: Adding 131064k swap on /media/DISK_A1/system/.swapfile.  Priority:-2 extents:1 across:131064k
Jan 18 00:00:21 S10dropbear: Start
Jan 18 00:00:21 dropbear[1413]: Running in background
Jan 18 00:00:21 S12vnstat: Start
Jan 18 00:00:21 S27mysqld: Start
Jan 18 00:00:21 S50lighttpd: Start
Jan 18 00:00:21 S90cron: Start
Jan 18 00:00:21 S99ftpmodificator: Start
...
Jan 18 00:00:32 kernel: fast vpn ctrl: fb016b4e, 1
...
Jan 18 00:00:34 pppd[1538]: primary   DNS address 85.21.192.5
Jan 18 00:00:34 pppd[1538]: secondary DNS address 213.234.192.7
Jan 18 00:00:35 Firewall: Start fw.sh
...
Jan 18 00:00:35 dnsmasq[1656]: read /etc/hosts - 2 addresses
Jan 18 04:00:49 zyntp[1708]: New time offset -> 11285213.
May 28 18:47:42 zyntp[1708]: Set new system time.
May 28 18:48:26 pppd[1538]: System time change detected.
...

В результате, например, vnstat категорически не желает работать с ppp0, если запускается до появления соединения. На примере vnstat приведу возможное решение проблемы.

В S12vnstatd вносим изменения: добавляем путь к дампу (по нужному Вам интерфейсу), обновление данных интерфейса, само получение дампа, рестарт vnstatd если не запущен и др. В примере ниже - интерфейс ppp0, то есть, например, медленный модем.

#!/bin/sh

MOUNT="/media/DISK_A1/system"
VBIN="$MOUNT/usr/sbin/vnstatd"
VPID="$MOUNT/var/run/vnstat.pid"
STAT="$MOUNT/www/vnstat/stat"

export PATH=$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:/sbin:/usr/sbin:/bin:/usr/bin
export LD_LIBRARY_PATH=$MOUNT/lib:$MOUNT/usr/lib:/lib:/usr/lib

daemon_status ()
{
    [ -f $VPID ] && [ -d /proc/`cat $VPID` ]
}

start_daemon() {
    $VBIN -d -p $VPID
}

stop_daemon() {
    kill `cat $VPID`
}

reload_daemon() {
    kill -HUP `cat $VPID`
}

case "$1" in
    start)
        if daemon_status
        then
            echo vnstatd already running
        else
            start_daemon
        fi
        ;;
    stop)
        stop_daemon
        ;;
    restart)
        stop_daemon
        sleep 1
        start_daemon
        ;;
    reload)
        reload_daemon
        ;;
    status)
        if daemon_status
        then
            echo Running
        else
            echo Not running
        fi
        ;;
    dumpdb)
        if daemon_status
        then
            vnstat -u -i ppp0
            vnstat --dumpdb -i ppp0 > $STAT/vnstat_dump_ppp0
        else
            start_daemon
        fi
        ;;
    link_up)
        ;;
    ppp_up)
        ;;
    link_down)
        ;;
    ppp_down)
        ;;
    *)
        echo "Usage: $0 {start|stop|reload|restart|status|dumpdb|link_up|link_down|ppp_up|ppp_down}"
        ;;
esac

Затем добавляем задание в crontab (для проверки - 1 минута, потом заменяем, например, на 5):

*/1 * * * * /media/DISK_A1/system/etc/init.d/S12vnstatd dumpdb

Если «на ходу» выдернуть модем из разъёма USB, а потом присоединить, то, как ни странно, vnstat продолжает работать, так что с разрывами соединения он и сам разбирается.

Аналогично можно поступить с иными приложениями, отказывающимися запускаться без соблюдения каких-либо предварительных условий.

Вторая проблема - когда нужна синхронизация времени по NTP, а подключения к сети интернет ещё нет, то приложения, критичные к астрономическому времени, оказываются запущены до подключения. В этом случае можно наблюдать, например, в статистике http-сервера, что он проработал много-много времени, а реально его запустили только что. Лично мне это не нравится)

Возможное решение - использовать лог zyntp, что находится в /tmp. Заодно решим другим способом первую проблему - с ниаличием подключения к сети интрнет при запуске - что критично, например, для davfs (помнится, просто давали задержку перед монтированием)… Хотя для этого можно использовать ping, но если мы не спешим - то пойдёт и zyntp.

Если время было получено, появится файл /tmp/zyntp.log и в нём будет строка с символами »→». Тогда можно использовать такую проверку:

#!/bin/sh

local i=60
while [ $i -gt 0 ] ; do
    if [ -f /tmp/zyntp.log ]
    then
        if grep -q \\-\> /tmp/zyntp.log
        then
            break
        fi
    fi
    sleep 1
    i=$((i-1))
done;

где «i=60» - задержка на 60 секунд, если за это время нет подключения, всё равно продожить.

Однако, в примере - 60 секунд - и, если использовать такой метод для http сервера, то он будет недоступен до подключения к сети интернет или до истечения интервала, и недоступен будет в том числе в локальной сети. Поэтому для http сервера можно перезапустить сервер, если обнаружилось подключение к сети интернет; ниже - фрагмент из S50lighttpd для примера:

    echo Starting lighttpd daemon...
    local i=0
    while [ $i -lt 60 ] ; do
        if [ -f /tmp/zyntp.log ]
        then
            if grep -q \\-\> /tmp/zyntp.log
            then
                if [ $i -ne 0 ]
                then
                    stop_daemon
                fi
                start_daemon
                break
            fi
        fi
        if [ $i -eq 0 ]
        then
            start_daemon
        fi
        sleep 1
        i=$((i+1))
    done;