Lupo Alberto как всегда вы правы не было пробела перед последней скобкой
поставил пробел все заработало
когда связь с сервером есть
на почту пришло письмо с ошибками в теле письма (но ошибки не критичные это нормально просто это тестовый сервер на нем до конца не настроен JBOSS и java и то что он ругается это нормально)
когда связи с сервером нет
на почту пришло письмо с прикрепленным файлом attachment
и внутри етого файла
ssh: connect to host 10.77.11.37 port 22: No route to host
ssh: connect to host 10.77.11.37 port 22: No route to host
такой вопросик почему когда нет связи информация приходит в файле attachment а не в теле письма?
Удаленное управление демонами
opryatniyav, в этом скрипте не учтено много различных ситуаций и сама его структура неправильна.
вот здесь если можно поподробнее !!!
Ваш скрипт делает следующее:
1. Подключиться к удалённому серверу и запустить команду остановки сервиса.
2.
а) Если команда закончилась с ошибкой, запустить команду принудительной остановки java;
б) если же команда остановки сервиса закончилась правильно, выполнить копирование файла на удалённый сервер.
3. При его удачном копировании запустить сервис.
4. Все сообщения об ошибках помещать в лог-файл. Затем этот лог-файл отправлять на почту.
Мне не нравится, что вместо того, чтобы запустить один скрипт на удалённом сервере, ему по ssh посылается три команды.
Мне не нравится, что сервис при определённых обстоятельствах просто «убивается». При таком завершении работы есть вероятность, что он в дальнейшем не сможет запуститься.
Если копирование произведено с ошибкой, сервис не запустится.
Если скрипт предполагается использовать для управления несколькими серверами, адрес и название лог-файла лучше вынести в переменные.
P.S. Оставляйте пробел после 2>> перед именем лог-файла ssh_02.log — быть может не критично, но «глаз режет» wink
P.S.S. Насчёт разных форматов почтовых отправлений, подумаю.
Однако, надеюсь, кто-либо быстрее подскажет причину такого поведения. wink
что можно сделать чтоб проконтролировать копирование
может как то можно сравнить записи по md5summ
подскажите как в этот конфиг вставить переменные допустим вместо айпи адреса и чтоб он запрашивал в начале скрипта этот адрес
#!/bin/bash
set -x
ssh 10.77.11.37 /etc/init.d/jboss stop 2>> ssh_02.log || \
ssh 10.77.11.37 pkill -9 java 2>> ssh_02.log && \
scp /opt/test 10.77.11.37:/opt/test 2>> ssh_02.log && \
ssh 10.77.11.37 /etc/init.d/jboss start 2>> ssh_02.log
[ -f ssh_02.log ] && cat ssh_02.log | mail -s "Error log on ssh_02" aleksandr.opryatniy@co.ksoe.com.ua
set +x
может как то можно сравнить записи по md5summ
Можно. Ещё нужно рассмотреть ситуацию, когда копируется поверх существующего файла.
подскажите как в этот конфиг вставить переменные допустим вместо айпи адреса и чтоб он запрашивал в начале скрипта этот адрес
Вы не забудьте потом убрать set -x, set +x — это только для отладки.
Переменные можно передавать в качестве аргументов скрипта
#!/bin/bash
REMOTE_IP=$1
ERROR_LOG=${REMOTE_IP}_error.log
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua
... и вызывать скрипт так:
[console]
./ssh_remote.sh 10.77.11.37
[/console]
либо в каждом экземпляре скрипта записать определённый адрес и вызывать без аргументов.
#!/bin/bash
REMOTE_IP="10.77.11.37"
ERROR_LOG=${REMOTE_IP}_error.log
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua
... и вызывать скрипт так:
[console]
./ssh_remote.sh
[/console]
так вроде scp копирует с заменой
так вроде scp копирует с заменой
Я же не знаю, насколько это для вас критично. Как велик размер файла, и стоит ли производить копирование, если файл существует.
размер файла около 20 мб
на сервере файл существует и его придется каждый раз заменять
каналы связи не очень 2-4 мегабита
opryatniyav, на компьютере, с которого производится управление, или даже на любом другом компьютере, есть возможность поднять ftp- или rsync-сервисы? Насколько критична информация, копируемая на сервера?
есть возможность поднять rsync только для каких целей если оно и так работает с помощью scp
вот итог наших с вами трудов за что я вам очень благодарен скрипт работает отлично
но остался последний вопрос как настроить сравнение файлов на клиенте и сервере? с помощью md5sum или же есть какие то другие варианты?
#!/bin/bash$
#set -x$
REMOTE_IP=$1$
ERROR_LOG=${REMOTE_IP}_error.log$
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \$
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \$
scp /opt/test $REMOTE_IP:/opt/test 2>> $ERROR_LOG && \$
ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG$
[ -f $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG$
#set +x$
есть возможность поднять rsync только для каких целей если оно и так работает с помощью scp
Я всё не теряю надежды убедить вас, чтобы скрипт выполнялся на удалённых компьютерах, а по rsync они бы получали нужный файл. wink
дело в том что этот скрипт со временем будет модернизироваться что то добавляться что то убираться. А если делать скрипт на каждом сервере потом замучаюсь редактировать
Мои мега боссы сказали чтоб было так smile
opryatniyav,
для примера набросал «на коленке»:
#!/bin/bash
set -x
REMOTE_HOST=${1}
FILE=${2}
FILE_MD5SUM=${FILE}.md5
scp ${FILE} ${REMOTE_HOST}:
ssh ${REMOTE_HOST} md5sum ${FILE} > ${FILE_MD5SUM}
md5sum -c --status ${FILE_MD5SUM} && echo "Файл скопировался успешно" || echo "Повторите передачу файла"
set +x
Вот отладочный вывод скрипта:
[console]
lupo@gentoo-laptop ~ % ./test.sh gentoo-home config.amd64
+ REMOTE_HOST=gentoo-home
+ FILE=config.amd64
+ FILE_MD5SUM=config.amd64.md5
+ scp config.amd64 gentoo-home:
config.amd64 100% 127KB 126.8KB/s 126.8KB/s 00:00
+ ssh gentoo-home md5sum config.amd64
+ md5sum -c --status config.amd64.md5
+ echo 'Файл скопировался успешно'
Файл скопировался успешно
+ set +x
[/console]
По уму бы надо добавить проверку передаваемых скрипту аргументов.
Lupo Alberto
REMOTE_HOST=${1}
FILE=${2}
а что обозначают {} просто в предыдущем конфиге их небыло
REMOTE_IP=$1
ERROR_LOG=${REMOTE_IP}_error.log
а что обозначают {} просто в предыдущем конфиге их небыло
Более строгое задание переменных, некоторые оболочки требуют.
появились новые условия в моем скрипте мой мозг сейчас взорвется :(
в этой части скрипта
ssh $REMOTE_IP /etc/init.d/jboss stop 2>> $ERROR_LOG || \
ssh $REMOTE_IP pkill -9 java 2>> $ERROR_LOG && \нужно добавить проверку того что если JBOSS не остановился по команде STOP то после выполнения pkill проверять удалился ли процесс если он не удалился то отправлять отчет по почте
и еще одно как заставить команду после выполнения ждать определенное количество времени допустим 180 сек
да кстати даже если все этапы скрипта выполняются нормально то все ровно приходит пустое письмо, не в курсе почему?
как можно вас отблагодарить за вашу помощь?
только начал разбираться с сравнение суммы MD5 как выяснилось что я не рассмотрел все варианты не выполнения скрипта!!!