Различия
Здесь показаны различия между выбранной ревизией и текущей версией данной страницы.
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> | + |