Различия



Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.

Ссылка на это сравнение

wiki:reshenija_problem [2013/05/29 08:55]
c61 создано
wiki:reshenija_problem [2013/08/20 19:28] (текущий)
c61
Строка 2: Строка 2:
  
  
-===== Проблемы с контролем программ установленных пакетов через cron ===== +  * [[Проблемы с контролем программ установленных пакетов через cron]] 
- +  [[Лог lighttpd]] 
-Если требуется включать контроль выполнения программ в ''cron'', то при его запуске до контролируемого пакета могут возникнуть проблемы (например, лишний перезапуск). Чтобы этого избежать, достаточно переименовать ''S02cron'' например в ''S90cron''. После этого он будет стартовать после контролируемых пакетов, а выгружаться перед. +  * [[Проблемы с сервером http при медленном установлении соединения с интернет и его разрывами/восстановлениями]] 
- +  [[Модем МТС 4G LTE создаёт проблемы с безопасностью]] 
-===== Лог lighttpd ===== +  * [[Сброс зависшего usb-модема (соединения) 3G/4G]]
- +
-Это лог непрерывно наращивается и просматривать его через некоторое время становится неудобно. Достаточно добавить ротацию в ''S50lighttpd''. +
- +
-1) Добавить после определения LOG_D имя файла лога, типа такого (или как-то иначе, по вкусу, как настроен лог)[code]LOG_F=$MOUNT/var/log/$BIN.log[/code+
- +
-2) после +
-<code>    ppp_down) +
-    ;;</code> +
-добавить<code>    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` +
-    ;;</code> +
- +
-3) заменить строку ''Usage'' на +
-<code>    echo "Usage: $0 {start|stop|restart|status|link_up|link_down|ppp_up|ppp_down|rotate}"</code> +
- +
-4) теперь остаётся только добавить задание cron запускать "S50lighttpd rotate", например, каждые сутки в 00:00, и в результате получаем красивое разбиение лога по датам: +
- +
-<code># lighttpd.log rotate (move to dir /var/log/lighttpd) +
-0 0 * * /media/DISK_A1/system/etc/init.d/S50lighttpd rotate</code> +
- +
-Разумеется, это давным-давно известное решение, но для ротации логов некоторые по привычке ищут logrotate. +
- +
-См. ниже измененный файл полностью: +
- +
-<code>#!/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</code> +
- +
-===== Проблемы с сервером http при медленном установлении соединения с интернет и его разрывами/восстановлениями ===== +
- +
-При длительном подключении к сети интернет или при разрывах/восстановлении соединения некоторые приложения начинают "дурить". Вот пример записей в журнале, иллюстрирующих проблемы: +
- +
-<code>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. +
-...</code> +
- +
-В результате, например, ''vnstat'' категорически не желает работать с ppp0, если запускается до появления соединения. На примере ''vnstat'' приведу возможное решение проблемы. +
- +
-В ''S12vnstatd'' вносим изменения: добавляем путь к дампу (по нужному Вам интерфейсу), обновление данных интерфейса, само получение дампа, рестарт vnstatd если не запущен и др. В примере ниже - интерфейс ''ppp0'', то есть, например, медленный модем. +
- +
-<code>#!/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</code> +
- +
-Затем добавляем задание в ''crontab'' (для проверки - 1 минута, потом заменяем, например, на 5): +
- +
-<code>*/1 * * * * /media/DISK_A1/system/etc/init.d/S12vnstatd dumpdb</code> +
- +
-Если "на ходу" выдернуть модем из разъёма USB, а потом присоединить, то, как ни странно, ''vnstat'' продолжает работать, так что с разрывами соединения он и сам разбирается. +
- +
-Аналогично можно поступить с иными приложениями, отказывающимися запускаться без соблюдения каких-либо предварительных условий. +
- +
-Вторая проблема - когда нужна синхронизация времени по NTP, а подключения к сети интернет ещё нет, то приложения, критичные к астрономическому времени, оказываются запущены до подключения. В этом случае можно наблюдать, например, в статистике http-сервера, что он проработал много-много времени, а реально его запустили только что. Лично мне это не нравится) +
- +
-Возможное решение - использовать лог zyntp, что находится в /tmp. Заодно решим другим способом первую проблему - с ниаличием подключения к сети интрнет при запуске - что критично, например, для davfs (помнится, просто давали задержку перед монтированием)... Хотя для этого можно использовать ping, но если мы не спешим - то пойдёт и zyntp. +
- +
-Если время было получено, появится файл /tmp/zyntp.log и в нём будет строка с символами "->". Тогда можно использовать такую проверку: +
- +
-<code>#!/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;</code> +
-где "i=60" - задержка на 60 секунд, если за это время нет подключения, всё равно продожить. +
- +
-Однако, в примере - 60 секунд - и, если использовать такой метод для http сервера, то он будет недоступен до подключения к сети интернет или до истечения интервала, и недоступен будет в том числе в локальной сети. Поэтому для http сервера можно перезапустить сервер, если обнаружилось подключение к сети интернет; ниже - фрагмент из ''S50lighttpd'' для примера: +
- +
-<code>    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;</code> +