Intereting Posts

Как я могу запустить скрипт, когда интернет-соединение вот-вот потеряется?

Я использую wvdial (PPP dialer) с модемом SIM-карты, и иногда это соединение сбрасывается на стороне сервера. Я хотел бы запустить скрипт, который greps ifconfig чтобы получить объем загруженных данных и где-то хранит их. Очевидно, это нужно делать, когда соединение все еще живое, иначе я ничего не получаю, или несколько секунд спустя значение для нового соединения, потому что wvdial настроен на немедленное повторное подключение, когда соединение потеряно. Есть идеи?

Редактировать:

Конечно, я могу grep выводить ifconfig каждую секунду или две, но это ужасное обходное решение, которое даже не стоит рассматривать. Лучший сценарий, который я могу себе представить, – это каким-то образом захватить сигнал, который инструктирует ifconfig «сбросить счет» => приостановить сигнал на мгновение => запустить мой скрипт => разблокировать сигнал. Но, возможно, есть и другие возможности, о которых я не знаю, например, например, configure ifconfig , чтобы выгрузить предыдущий результат в файл, если данный интерфейс исчезнет. Другой вариант – вывести результат не из ifconfig в другом месте. BTW, каков источник ввода ifconfig ?

вы можете написать свой собственный сценарий оболочки, который регистрирует именно то, что вы хотите, через некоторое время (1) цикл с вызовом сна в конце (или любой желаемый уровень сна). Что-то вроде этого:

 function get_logname { echo `date +'%F-%H-%M-%S'`.log } function am_online { ping -c 1 google.com >/dev/null 2>&1 echo $? } function update_logfile { echo "YOUR DATA TO BE LOGGED" >> $1 } CUR_LOG=`get_logname` echo $CUR_LOG while [ 1 ]; do if [ "`am_online`" -eq 0 ]; then update_logfile $CUR_LOG else echo "we are offline!" CUR_LOG=`get_logname` fi sleep 1 done 

Пока вы находитесь в сети, он регистрируется в вашем файле журнала (>> для добавления новых данных,> для перезаписи файла, содержащего только новые данные) каждую секунду. Когда вы находитесь в автономном режиме, он постоянно выбирает новое имя для следующего файла журнала и ничего не записывает. Когда вы вернетесь в онлайн, он начнет регистрировать новый файл журнала с последним выбранным именем файла журнала, оставив неповрежденный файл журнала.

Это должно сделать трюк для вас. Как и во всем коде, который вы найдете в Интернете, ваша ответственность – проверить его и убедиться, что он делает то, что вы хотите, и ничего не сломает. В частности, в этом случае, будьте осторожны, что лог-файлы могут быстро набирать масштаб, и что если вы часто отправляетесь в автономный режим, вы можете получить кучу лог-файлов.

Сохраните как-то вроде «my_internet_logging_script.sh» и запустите как:

 sh my_internet_logging_script.sh 

в каталоге, где вы хотите, чтобы ваши лог-файлы (или редактировали сценарий соответственно).

Отвечая на ваш последний вопрос: ifconfig читает /proc/net/dev и /proc/net/if_inet6 . Информация о передаваемых данных для разных интерфейсов доступна в первом из этих файлов.

/proc – специальная файловая система, файлы которой не хранятся на жестком диске, но создаются ядром каждый раз, когда вы хотите их прочитать, поэтому доступ к файлам довольно быстр. Кроме того, parsing /proc/net/dev непосредственно должен быть немного быстрее, чем разбор ifconfig поскольку эта команда выполняет разные действия, которые вам не нужны.

Чтобы дать вам приблизительную идею, пришло время для 1000 повторных ifconfig или cat /proc/net/dev (repeat is zsh command):

 $ time (repeat 1000 ifconfig > /dev/null) 1.14s user 3.85s system 90% cpu 5.513 total $ time (repeat 1000 cat /proc/net/dev > /dev/null) 0.57s user 2.44s system 70% cpu 4.282 tota 

Разумеется, разбор /proc/net/dev прежнему не является хорошим решением, но, по крайней мере, вы можете получить 20-30% в скорости, если, в конце концов, вы решите анализировать выходные данные каждую секунду.