LinuxForum.Fans
Тема

Помогите написать bash скрипт

Автор: bitmaster 39 сообщений 8765 просмотров
#375713
"bitmaster" написал:
тоесть смотреть есть ли страничка или нет

[console][xxblx@localhost ~]$ curl -Is http://xxblx-duke.com | head -1
HTTP/1.1 200 OK
[xxblx@localhost ~]$ curl -Is http://xxblx-duke.com/123.html | head -1
HTTP/1.1 404 Not Found
[xxblx@localhost ~]$ wget http://xxblx-duke.com/123.html
--2014-04-08 14:02:14-- http://xxblx-duke.com/123.html
Распознаётся xxblx-duke.com (xxblx-duke.com)... 31.28.24.133
Подключение к xxblx-duke.com (xxblx-duke.com)|31.28.24.133|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 404 Not Found
2014-04-08 14:02:14 ОШИБКА 404: Not Found.[/console]
Когда странички нет, запрос к ней вернет 404-ую ошибку. Если веб-сервер "не против" :)
[console][xxblx@localhost ~]$ curl -Is http://linuxforum.ru | head -1
HTTP/1.1 200 OK
[xxblx@localhost ~]$ curl -Is http://linuxforum.ru/123.html | head -1
HTTP/1.1 200 OK
[xxblx@localhost ~]$ wget http://linuxforum.ru/123.html
--2014-04-08 14:03:42-- http://linuxforum.ru/123.html
Распознаётся linuxforum.ru (linuxforum.ru)... 188.64.170.124
Подключение к linuxforum.ru (linuxforum.ru)|188.64.170.124|:80... соединение установлено.
HTTP-запрос отправлен. Ожидание ответа... 200 OK
Длина: нет данных [text/html]
Сохранение в: «123.html»

[ <=> ] 57 794 --.-K/s за 0,06s

2014-04-08 14:03:43 (996 KB/s) - «123.html» сохранён [57794][/console]
Здесь на LF как видно, это не прокатывает. 123.html, по сути, сохраняется как переименованный index.html, несмотря на то что 123.html вроде как и нету.

#375716

большое спасибо, сейчас попробую.

#375719

Я делал так:

text

curl --silent http://linuxforum.ru|grep Вход
if [ `echo $?` -eq 0 ]; then echo "True"
else echo "False"
fi

На выходе получим:

text

<li id="navlogin"><a href="http://linuxforum.ru/login.php">Вход</a></li>
True

а если сделать так:

text

curl --silent http://linuxforum.ru|grep Войти
if [ `echo $?` -eq 0 ]; then echo "True"
else echo "False"
fi

то получим False

#375720

а вот вопрос если веб сервер упадет то по сути 404 мне выдаваться не будет. у меня проблема с сервером glassfish , он как бы не падает ибо в процессах он висит, но веб веб сервер не доступен. (из за высоких нагрузок). думал определить "упал он или нет" пингом, но вариант не катит так как он частично работает и пингуется . а конкретно нужную мне страничку пингануть нельзя. в плане командой ping

#375721
"bitmaster" написал:
а вот вопрос если веб сервер упадет то по сути 404 мне выдаваться не будет.  у меня проблема с сервером glassfish , он как бы не падает ибо в процессах он висит, но веб веб сервер не доступен. (из за высоких нагрузок). думал определить "упал он или нет" пингом, но вариант не катит так как он частично работает и пингуется . а конкретно нужную мне страничку пингануть нельзя. в плане командой ping

я же написал как это можно сделать, через curl дергать страницу.

#375722
i2ks написал:
[quote="bitmaster"]а вот вопрос если веб сервер упадет то по сути 404 мне выдаваться не будет.  у меня проблема с сервером glassfish , он как бы не падает ибо в процессах он висит, но веб веб сервер не доступен. (из за высоких нагрузок). думал определить "упал он или нет" пингом, но вариант не катит так как он частично работает и пингуется . а конкретно нужную мне страничку пингануть нельзя. в плане командой ping

я же написал как это можно сделать, через curl дергать страницу.[/quote]
сейчас попробую. отпишу что получилось

#375726

а можете дать пояснение этой строке

text
if [ `echo $?` -eq 0 ]
#375728

bitmaster, а поискать? http://www.opennet.ru/docs/RUS/bash_scripting_guide/
Это условие, проверяющее код завершения последней выполненной команды. И echo там не нужно.

#375730
"yars" написал:
И echo там не нужно.

о как, а как тогда?

#375731

i2ks,

text
if [ $? -eq 0 ]; then whatewer; fi

не работает? Или даже

text
if program; then whatewer; fi

?

#375732

да все ок)

#375733

в общем скрипт мой готов,
что он делает?
проверяет слово hello на страничке, если такого слова нет то он убивает процесс glassfish а и запускает его заново. скрипт будет в кроне и будет запускаться раз в 5 мин. Так что подскажите если вдруг я что то не учел
[console]#!/bin/bash

ADDRESS="my_url/index.jsp"

function stop_domain {
#echo "stop_domain"

PID=`ps -ef|grep java|grep glassfish|awk '{print $2}'`

#echo "Glassfish PID = '$PID'. Trying to kill it..."

if [[ "$PID" != "" ]]
then
#echo "No need to kill."

kill -9 $PID
fi

PID2=`ps -ef|grep java|grep glassfish|awk '{print $2}'`

#echo "Glassfish PID after 'kill' command = '$PID2'"

return $PID2
}

#stop_domain

curl --silent $ADDRESS|grep Hello

if [ "$?" -eq 0 ]
then
echo "Application server is alive."
else
result=$(stop_domain)

if [[ "$result" == "" ]]
then
#echo "Executing start-domain command..."
/home/glassfishUser/glassfish3/glassfish/bin/asadmin start-domain
#echo "Application server was started successfully!"
fi
[/console]

#375734

и вопрос . почему в функции если разкоментить echo то он будет попадать сюда PID=.. какого хрена

#375735
bitmaster написал:
text
PID=`ps -ef|grep java|grep glassfish|awk '{print $2}'`

Эту конструкцию разве нельзя заменить на

text
PID=$(/sbin/pidof /path/to/glassfish)

?

и вопрос . почему в функции если разкоментить echo то он будет попадать сюда PID=.. какого хрена

Пропущен CR/LF? Проверяется cat -A your_mega_script.sh.

#375738

Пользуясь случаем прошу потыкать носом и подсказать что сделал не так. Вот сегодня накатал скрипт
[console]#!/bin/sh

IP_WEB=192.168.1.108 # IP адрес шары
PID_TOM="/var/run/tomcat6.pid"
WRITELOCK="/var/lib/tomcat6/solr_home/data/index/write.lock"
DIR_IN=/var/Motiw/scripts
DIR_OUT="${IP_WEB}:/var/Motiw/scripts"

filecount=`find $DIR_IN -type f | wc -l`

if [ $filecount -eq 0 ]; then
echo "Error. Not mount script NFS"
#Монтируем /var/Motiw/scripts для tomcat
/bin/mount $DIR_OUT $DIR_IN
if [ $? -ne 0 ]; then
echo ERROR
else
sleep 3
#Проверяем PID tomcat. Если запущен, рестаруем
# и удаляем возможно подвисший write.lock
if [ -e $PID_TOM ]; then
if [ -e $WRITELOCK ]; then rm $WRITELOCK && /etc/init.d/tomcat6 restart
else
echo "${WRITELOCK} отсутствует" && /etc/init.d/tomcat6 restart
fi
else
if [ -e $WRITELOCK ]; then
rm $WRITELOCK && /etc/init.d/tomcat6 start
else
echo "${WRITELOCK} отсутствует" && /etc/init.d/tomcat6 start
fi
fi
fi
echo "mount OK" >> /var/log/mountfix.log
else
#Если все смонтировано, ничего не делаем
echo "mount OK" >> /var/log/mountfix.log && exit
fi
[/console]
Суть его в следующем. Каждые 15 минут в кроне проверяется примонтирован ли диск. Если да, то супер, если нет то монтирует его. Проверяет на наличие файла блокировки. Если он есть - удаляет. Затем перезапускает сервис tomcat. Через одно место реализовал? =)

З.Ы. Надо поработать с синтаксисом. Не осень красиво смотрится. =)

#375745

XliN, имхо нормально все. Работает - не трогай :)

#375767

а подскажите как теперь сделать запись в лог файл. в случае если веб сервер был перезапущен. Тоесть скрипт будет в кроне (каждые 5 мин запускаться). если страничка доступна то мы ничего не делаем и ничего не пишем. а вот если она не доступна мы убиваем процесс глассфиша и запускаем его заного и пишем все действия в лог с датой и так далее
вот код
[console]#!/bin/bash
ADDRESS="my_url/index.jsp"
function stop_domain {
PID=`ps -ef|grep java|grep glassfish|awk '{print $2}'`
if [[ "$PID" != "" ]]
then
kill -9 $PID
fi
PID2=`ps -ef|grep java|grep glassfish|awk '{print $2}'`
return $PID2
}
curl --silent $ADDRESS|grep Hello
if [ "$?" -eq 0 ]
then
echo "Application server is alive."
else
result=$(stop_domain)
if [[ "$result" == "" ]]
then
/home/glassfishUser/glassfish3/glassfish/bin/asadmin start-domain
fi[/console]

#375841

Так и пиши в лог

text
echo "То, что хочешь записать" >> /полный_путь/log.file
Войдите или зарегистрируйтесь, чтобы ответить.