LINUX.ORG.RU

[sh] help me or kill me;


0

2

Я никогда видимо не смогу понять этот язык, тем не менее иногда очень нужен. Сейчас пишу скрипт хранителя интернета - проверяет наличие/отсутсвие интернета и предпринимает действия для исправления ситуации + пишет лог. Вот сие чудо:

#!/bin/bash
logfile="inet_statistics.log" # как вот это

while true; do
	result0=$(ping -c 3 google.ru | tail -2 | head -1 | awk '{print $4}')
	if [ $result0 -eq 0 ]; then
		echo "Интернет отвалился примерно "`date`" (+- 8 минут)" >> inet_statistics.log	# использовать здесь	
		while [ $result0 -eq 0 ]; do
			echo "Пробуем перезагрузить сетевой интерфейс eth0..." >> inet_statistics.log # и вообще везде?
			# \/ надо бы заменить на ./restartinet.sh
			$(ifdown eth0 && ifup eth0) >> inet_statistics.log # как записать выхлоп команд в лог?
			echo "Проверяем результат " >> inet_statistics.log
			result0=$(ping -c 3 google.ru | tail -2 | head -1 | awk '{print $4}')
			if [ $result0 -eq 0 ]; then
				echo "Интернет не поднялся, повторная попытка через 4 минуты." >> inet_statistics.log
			fi
			sleep 240
		done
		echo "Интернет заработал "`date`"\n\n" >> inet_statistics.log
	fi
	sleep 480
done

Осталось совсем чуть чуть... Помогите...

Ну не так он уже и нужен я бы сказал. Есть Perl, помощнее и синтаксис если быть консервативным (читай писать как на JavaScript), то очень читаемый.

vertexua ★★★★★ ()

$(ping -c 3 google.ru | tail -2 | head -1 | awk '{print $4}')

жуть какая.

можно просто

ping -q -c 3 google.ru
result0=$?

lazyklimm ★★★★★ ()

1. echo «Интернет отвалился примерно »`date`" (+- 8 минут)" >> $logfile 2. выхлоп (command | tee -a $logfile) - добавляет в $logfile и выводит в stdout.

Tanger ★★★★★ ()

а ваще надо чтото типа

while true; do
 until ping -q -c 3 8.8.8.8 >/dev/null                                                                                             
 do
   echo "Интернет отвалился примерно "`date`" (+- 8 минут)"
   $(ifdown eth0 && ifup eth0)
   sleep 240
 done
 echo "интернет работает"
sleep 480
done
lazyklimm ★★★★★ ()
Ответ на: а ваще надо чтото типа от lazyklimm

или даже

while true; do
 ping -q -c 3 8.8.8.8 > /dev/null &&
   echo "интернет работает" ||
   (echo "интернет отвалился etc" && ifdown eth0 && ifup eth0)
 sleep 240
done
lazyklimm ★★★★★ ()
Ответ на: комментарий от sin_a

Я ни..чего не понял

#!/bin/bash
logfile="inet_statistics.log"

2>&1

while true; do (
	result0=$(ping -q -c 3 google.ru)
	if [ $result0 -eq 0 ]; then
		echo "Интернет отвалился примерно "`date`" (+- 8 минут)"
		while [ $result0 -eq 0 ]; do
			echo "Пробуем перезагрузить сетевой интерфейс eth0..."
			ifdown eth0 && ifup eth0
			echo "Проверяем результат "
			result0=$(ping -q -c 3 google.ru)
			if [ $result0 -eq 0 ]; then
				echo "Интернет не поднялся, повторная попытка через 4 минуты."
			fi
			sleep 240
		done
		echo "Интернет заработал "`date`"\n\n"
	fi
	) >> $logfile
	sleep 480
done

Почему

inet_keeper.sh: 23: ifdown: not found
сыпется в консоль, а не в лог.
[: 24: PING: unexpected operator
Что он хочет от меня?

anonymous327 ()
Ответ на: комментарий от anonymous

>мда ... вот и подросло поколение ... google != internet, вашу мать...негодуэ

А что мне пинговать? ya.ru? sex.com? Что там ещё за пределами локалки всегда работает?

anonymous327 ()

по хорошему, перед тем как бомбить google или ещё кого в мире пингами, надо проверять местные условия :)

- поднят ли вообще интерфейс
- назначен-ли ему адрес
- отвечает ли сам интерфейс
- отвечает ли шлюз
- отвечают ли DNS
- резолвят ли DNS местные узлы (самих себя,шлюз)
- резолвят ли DNS внешние узлы (часто запрашиваемые)
- Когда указанные проверки прошли успешно, можно послать ping или traceroute куда нибудь, но исключительно для самоуспокоения или предъявы претензий провайдеру. Потому что если всё предыдущее работает, а связи нет - то это проблема маршрутизации у провайдера.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

>надо проверять местные условия :)

год использования интернета моего провайдера показало, что 98% проблем решается двумя командами ifdown eth0 && ifup eth0. Не вижу смысла делать что либо ещё.

anonymous327 ()
Ответ на: комментарий от anonymous327

парень, отсутствие гугл != отсутствие интернет. у тебя может отвалится DNS, но инет при это будет. гугл может сдохнуть, но инет при этом будет. Можно пинговать свой DNS, и то некозявое решение. Можно пинговать корневые DNS, в конце концов.

вообще можно задачу разделить на проверку доступность гейта и доступность своего ДНС (ну ладно, можно предположить нет свеого днс == нет своего инета, ибо юзеры в панике, любимый вкантактик не открывается).

anonymous ()
Ответ на: комментарий от MKuznetsov

а вот с этим согласен. четкий, аргументированный ответ

Pinkbyte ★★★★★ ()
Ответ на: комментарий от anonymous

а ты аргументацию, ЧТО ты считаешь наличием интернета привел? нет? ну так и иди куда шел... вон выше я отписался, что согласен с человеком, который ПО ПУНКТАМ(может некоторые из них и излишне, но все-таки) разложил что МОЖНО считать доступностью интернета. А что скажет уважаемый анонимус, кроме невнятных посылов на то, что «так делать низзя»?

Pinkbyte ★★★★★ ()
Ответ на: комментарий от MKuznetsov

надо проверять местные условия

не надо, это злейший антипатрн. Если совсем приспичило, достаточно пингануть два-три хоста с разных континентов, этого достаточно. Потому что это сразу и шлюз, и днс и маршрутизацию. Ибо юзеру всё равно по какой причине инета нет.

true_admin ★★★★★ ()
Ответ на: комментарий от o

покажет себя во всей красе!

Чё страшного будет? Скрипт перестанет писать в лог? :)

true_admin ★★★★★ ()
Ответ на: комментарий от o

Но, вообще, лучше сразу в syslog класть и радоваться ротации логов :)

true_admin ★★★★★ ()
Ответ на: комментарий от o

>А еще если место на разделе закончится,

3 строчки раз в 4 минуты, ммм... да мой 5,25-дюймовый Shugart ST-412 на 10 Мб действительно этого долго не протянет.

anonymous327 ()
Ответ на: комментарий от true_admin

юзеру всё равно по какой причине инета нет.

юзеру то конечно всё равно..а вот админу и сапорту нет. Предъява типа " не пингуется a.com" вызовет у саппорта как минимум улыбку, а возможно и раздражение - потому что это личная проблема ТС как админа и a.com.

зы вообще по топику «не смогу понять этот язык, тем не менее иногда очень нужен. Сейчас пишу скрипт хранителя интернета - проверяет наличие/отсутсвие интернета»: скрипт зовётся /bin/true, интернет есть.

MKuznetsov ★★★★★ ()
Ответ на: комментарий от sin_a
#!/bin/bash
logfile="inet_statistics.log"

2>&1

while true; do (
	ping -q -c 3 google.ru >/dev/null
	if [ $? -ne 0 ]; then
		echo "Интернет отвалился примерно "`date`" (+- 8 минут)"
		while [ $? -eq 0 ]; do
			echo "Пробуем перезагрузить сетевой интерфейс eth0..."
			ifdown eth0 && ifup eth0
			echo "Проверяем результат "
			ping -q -c 3 google.ru >/dev/null
			if [ $? -ne 0 ]; then
				echo "Интернет не поднялся, повторная попытка через 4 минуты."
			fi
			sleep 2
		done
		echo "Интернет заработал "`date`"\n\n"
	fi
	) >> $logfile
	sleep 4
done

в логе: Пробуем перезагрузить сетевой интерфейс eth0...
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Проверяем результат
Интернет не поднялся, повторная попытка через 4 минуты.
Пробуем перезагрузить сетевой интерфейс eth0...
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Проверяем результат
Starting Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Stopping Avahi mDNS/DNS-SD Daemon: avahi-daemon.
Проверяем результат

И так до бесконечности, хотя инет заработал, все интересные подробности

root@greh-desktop:/home/greh# sh inet_keeper.sh 
ping: unknown host google.ru
Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/00:1a:4d:5e:6e:08
Sending on   LPF/eth0/00:1a:4d:5e:6e:08
Sending on   Socket/fallback
DHCPRELEASE on eth0 to 192.168.0.1 port 67
Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/00:1a:4d:5e:6e:08
Sending on   LPF/eth0/00:1a:4d:5e:6e:08
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 5
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 14
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 18
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 10
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 14
No DHCPOFFERS received.
No working leases in persistent database - sleeping.
ping: unknown host google.ru
остаются в терминале.

anonymous327 ()
Ответ на: комментарий от anonymous327

> #!/bin/bash

logfile=«inet_statistics.log»

2>&1

А теперь проверь как я написал выше.

Да, в моём варианте скобки не нужны.

sin_a ★★★★★ ()
Ответ на: комментарий от anonymous327

проверь это:

#!/bin/bash

logfile="inet_statistics.log"
exec 2>&1
exec >> $logfile


CHECK(){
	ping -q -c 3 $1 >/dev/null
	error=$?
	if [ $error -ne 0 ]; then
		echo "Интернет не работает: "`date`
		while [ $error -eq 0 ]; do
			echo "Пробуем перезагрузить сетевой интерфейс eth0..."
			ifdown eth0 && ifup eth0
			echo "Проверяем результат "
			ping -q -c 3 $1 >/dev/null
			error=$?
			if [ $error -ne 0 ]; then
				echo "Интернет не поднялся, повторная попытка через 4 минуты."
			fi
			sleep 2
		done
		echo "Интернет заработал: "`date`"\n\n"
	fi
}


while true; do 
	CHECK 8.8.8.8
	sleep 4
done
sin_a ★★★★★ ()
Ответ на: комментарий от anonymous327
21:36 sinaps@wind ~/bin $ cat test.redirect.sh     
#!/bin/bash
#

LOG="/tmp/test.redirect.log"

exec 2>&1
exec > $LOG

date
echo test
exit 0
21:36 sinaps@wind ~/bin $ ls -l /tmp/         
итого 0
21:36 sinaps@wind ~/bin $ ./test.redirect.sh       
21:36 sinaps@wind ~/bin $ ls -l /tmp/       
итого 4
-rw-r--r-- 1 sinaps sinaps 40 Авг  1 21:36 test.redirect.log
21:36 sinaps@wind ~/bin $ cat /tmp/test.redirect.log 
Пнд Авг  1 21:36:34 MSD 2011
test
21:36 sinaps@wind ~/bin $ 

Может быть имеет смысл указать лог с абсолютным путём. Лучше в /tmp, что бы быть уверенным что есть права на запись.

sin_a ★★★★★ ()
Ответ на: комментарий от anonymous327

В данном случае в терминал вывода и не будет. Что бы получить вывод в терминал нужно закомментировать те три строки в начале.

sin_a ★★★★★ ()
Ответ на: комментарий от sin_a

что ты мучаешься, у ТС основная проблема не в перенаправлении вывода из скрипта, а (судя по приведённому логу) в хреновом,перегруженном канале. То есть «ping -c 3 куда_нибудь» может выдать ошибку и при работающей связи; и dhclient не настроен на работу в этих условиях - он просто не успевает получить адрес до ухода в sleep. В скрипте указанное решается заданием разумных счётчиков и таймаутов в ping`е, поднастройкой dhcp и правкой той части скрипта которая следует за ifup

А чтобы просто было меньше ухабов (связь якобы плавнее) в систему стоит добавить squid в максимальных настройках и кеширующий dns.

К тому-же есть странные 3G/4G и прочие кривые провайдеры, сами рвущие связь при отсутствии активности - просто периодический тупой пинг или запрос случайной страницы wget`ом (смотря что пров. считает активностью) решат часть проблемы. Ещё провайдер может неправильно выдавать данные в leases (Stream например этим грешил) - например неправильно указывать время абонирования, тогда достаточно передёргивать dhcp раз или два в день. Ещё пров может рвать связь за превышение разных лимитов. Все причины можно узнать и побороть, и не передёргивать сетевую часть. ifdown/ifup - это всё таки крайний метод, почти reboot :)

Это я к тому, что вместо «хранителя» Интернета стоит разобраться в существе проблемы и побороть сам источник зла, а не лечить симптомы.

ps. полностью написать за человека программу или скрипт - наихудший вид помощи в «Development».

MKuznetsov ★★★★★ ()
Ответ на: комментарий от sin_a

> Ой... Твоё кунфу сильнее моего... :)
Ирония-mode? Осталось проблема с передаваемыми параметрами
Если на 77строке заключить $M_FILE в "", то во время старта mplayer показывает позицию субтитров, громкость и задержку субтитров, если кавычки убрать, то некоторые файлы обрабатываются некорректно.
dfm.mime

video/* mplayer

text/* urxvt_-e_emacs_-nw


image/vnd.djvu ~/script/apvlv.sh


image/* feh


и файл

picture/144348-1920x1080.jpg: image/jpeg; charset=binary

tn1 ()
Ответ на: комментарий от sin_a

> Ты там не проверяешь наличие и корректность параметров, или я не нашёл?
Проверяю пустые переменные, «конфиги». Других потенциальных ошибок не нашёл.

tn1 ()
Ответ на: комментарий от tn1

<offtop> глянул скрипт, критиковать не буду - все ошибки в процессе эксплуатации исправяться. Пара идей: 1) в конфигах сделать разделитель полей ";" чтобы избавиться от tr «_» " " и разрешить _ в именах файлов 2) решить что делать если в конфиге несколько вариантов для mime-типа 3) меню строить более интеллектуально, а не просто через ls. Отфильтровывать явно лишнее и добавлять контекстные пункты. К примеру наличие Makefile в каталоге может добавлять пункты debug release clean, более 1-го *.mp3 «play all» </offtop>

MKuznetsov ★★★★★ ()
Ответ на: комментарий от tn1

Да нет, без всякой иронии. Я вообще с некоторым усилием понял что оно вообще делает :) . Может быть имеет смысл в неясных случаях в шабанг добавлять к bash ключ -x , что бы можно было в терминале видеть в каком виде непосредственно вызывается команда.

sin_a ★★★★★ ()
Ответ на: комментарий от sin_a

> Да нет, без всякой иронии. Я вообще с некоторым усилием понял что оно вообще делает :)
Ясно, добавлю комментарии.

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

Не знал, попробую.

PS уже исправил пару ошибок.

tn1 ()
Ответ на: комментарий от MKuznetsov

> 1) в конфигах сделать разделитель полей ";" чтобы избавиться от tr «_» " " и разрешить _ в именах файлов
fxd

2) решить что делать если в конфиге несколько вариантов для mime-типа

break же, выйдет после 1ого совпадения.

3) меню строить более интеллектуально, а не просто через ls

Например?imho, dmenu не позволит.

К примеру наличие Makefile в каталоге может добавлять пункты debug release clean, более 1-го *.mp3 «play all»

Хорошая идея, но уместить это всё на одной строке ... потом ещё и прокручивать экран для поиска нужного файла ... не для слабонервных.Есть sh: <comman> - для выполнения одной команды и shell: - для режима «shell». Хотя можно поменять приветствие в зависимости он типов файлов в директории.

PS код обновил.

tn1 ()
Ответ на: комментарий от tn1

При создании каталога для конфигурации возможно имеет смысл вызывать mkdir с ключом -p , на случай если каталога .config вдруг не окажется.

sin_a ★★★★★ ()
Ответ на: комментарий от sin_a

Можно даже просто проверять файл конфигурации и если такового нет то перед сообщением создавать каталог, с ключом -p при наличии каталога mkdir просто завершится нормально без сообщений об ошибке (а если конфиг есть то и каталог под него очевидно тоже уже есть).

sin_a ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.