Это старая версия документа.
Содержание
Решение проблем
[[Проблемы с контролем программ установленных пакетов через cron]]
Лог 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;