LinuxForum.Fans
Тема

Удаленное управление демонами

Автор: opryatniyav 195 сообщений 20493 просмотров
#196727

проблема решена

opryatniyav написал:
как остановить скрипт при выполнении этой команды ([ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG ;exit)
exit не подходит почему то

таким вот способом

text
if (ssh $REMOTE_IP /etc/init.d/jboss stop ;sleep 15) || (ssh $REMOTE_IP pkill -9 -f 'jboss' 2>> $ERROR_LOG ;sleep 15)
then ssh $REMOTE_IP pgrep -f 'jboss' >> $ERROR_LOG && \
([ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG) && exit 0
fi
#196732

в данной ситуации если jboss не стопнулся выполняется sleep но потом не выполняется pkill (я так понял что он понимает что sleep 15 || выполнился нормально и пропускает следующую команду) есть какие нибудь идеи подскажите пожалуйста как это подправить?
if (ssh $REMOTE_IP /etc/init.d/jboss stop ;sleep 15) || (ssh $REMOTE_IP pkill -9 -f 'jboss' 2>> $ERROR_LOG ;sleep 15)

#196747

Lupo Alberto, ну где же ты мой спаситель smile

#197362

вот что у меня вышло если кому интересно

text
#!/bin/bash
set -x
REMOTE_IP=${1}
ERROR_LOG=${REMOTE_IP}_error.log
FILE_IN=${2}
FILE_OUT=${3}
ping -c 4 $REMOTE_IP > /dev/null
if [ $? -eq 1 ]
then echo "" | mail -s "нет связи с $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && exit 0
fi
if
ssh $REMOTE_IP /etc/init.d/jboss stop
sleep 1
ssh $REMOTE_IP pkill -9 -f 'jboss' 2>> $ERROR_LOG
sleep 1
then ssh $REMOTE_IP pgrep -f 'jboss' >> $ERROR_LOG && \
([ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG) && exit 0
fi
if rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG || \
(sleep 1 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 2 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 3 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 4 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG)
then ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
else [ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG
fi
[ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "Error log on $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG
set +x

вот только небольшая проблемка если во время копирования файла пропадает связь то нечего не происходит он просто висит нажимаю Ctrl+C прерывается процесс копирования и пытается стартануть новый

#197375

rsync умеет докачивать файлы. В чем проблема то? Ну если связь оборволась, то можно проверку сделать.

#197381

Дело в том что мне нужно на много серваков заливать файлы, а связь идет через ADSL модемы и она не очень стабильная, если где нибудь сгорит модем и связь пропадет и в данный момент будет происходить копирование то оно будет висеть пока связь не появится.
Может есть какой нибудь ключ чтоб при обрыве связи ждал 60 сек и завершал работу ?

#197382

opryatniyav, ну например в фоне запускай (добавляй & к команде)
Пример
[console]rsync <ключи запуска> &[/console]

#197383

а если

newzenon написал:
opryatniyav, ну например в фоне запускай (добавляй & к команде)
Пример
Консоль:
rsync <ключи запуска> &

что то не понял подсказки с каким ключом запускать ?

#197384

дело в том что все будет работать автоматизированно
будет еще один скрипт который будет запускать весь процесс

text
linuxssh01:/bash # cat ./script.sh
#!/bin/bash
./rsync.sh 10.77.11.37 /bash/test /bash/ & \
./rsync.sh 10.77.11.38 /bash/test /bash/ & \
./rsync.sh 10.77.11.39 /bash/test /bash/ & \
./rsync.sh 10.77.11.40 /bash/test /bash/ & \
./rsync.sh 10.77.11.41 /bash/test /bash/ & \
./rsync.sh 10.77.11.42 /bash/test /bash/ & \
./rsync.sh 10.77.11.43 /bash/test /bash/
text
linuxssh01:/bash # cat ./rsync.sh
#!/bin/bash
set -x
REMOTE_IP=${1}
ERROR_LOG=${REMOTE_IP}_error.log
FILE_IN=${2}
FILE_OUT=${3}
ping -c 4 $REMOTE_IP > /dev/null
if [ $? -eq 1 ]
then echo "" | mail -s "нет связи с $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && exit 0
fi
if
ssh $REMOTE_IP /etc/init.d/jboss stop
sleep 1
ssh $REMOTE_IP pkill -9 -f 'jboss' 2>> $ERROR_LOG
sleep 1
then ssh $REMOTE_IP pgrep -f 'jboss' >> $ERROR_LOG && \
([ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "JBOSS не остановлен $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG) && exit 0
fi
if rsync -vvvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG || \
(sleep 1 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 2 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 3 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 4 ;rsync -vvpgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG)
then ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
else [ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "error_copy $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG
fi
[ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "JBOSS не стартанул $REMOTE_IP" aleksandr.opryatniy@co.ksoe.com.ua && rm -f $ERROR_LOG
set +x
#197385

Если надо рвать сессию:
То у ssh есть опции:

ClientAliveCountMax и ClientAliveInterval

ClientAliveCountMax – Параметр указывает на полное количество сообщений, отсылаемого ssh-сервером для распознавания активности ssh-клиента. По умолчанию это 3.
ClientAliveInterval – Параметр указывает на время ожидания в секундах. После указанного времени ssh-сервер отошлет сообщение-запрос клиенту. По умолчанию значение этого параметра - 0. Т.е сервер не отсылает сообщение для проверки.

В bash есть опция TMOUT

TMOUT If set to a value greater than zero, TMOUT is treated as the
default timeout for the read builtin. The select command termi‐
nates if input does not arrive after TMOUT seconds when input is
coming from a terminal. In an interactive shell, the value is
interpreted as the number of seconds to wait for input after
issuing the primary prompt. Bash terminates after waiting for
that number of seconds if input does not arrive.

#197387

i2ks, спасибо за инфу будем пробовать smile

#197521
i2ks написал:
Если надо рвать сессию:
То у ssh есть опции:
ClientAliveCountMax и ClientAliveInterval
    ClientAliveCountMax – Параметр указывает на полное количество сообщений, отсылаемого ssh-сервером для распознавания активности ssh-клиента. По умолчанию это 3.
    ClientAliveInterval – Параметр указывает на время ожидания в секундах. После указанного времени ssh-сервер отошлет сообщение-запрос клиенту. По умолчанию значение этого параметра - 0. Т.е сервер не отсылает сообщение для проверки.

Это мне не поможет так как оно настраивается на удаленном сервере на который идет копирование, так если не будет с ним связи как он сможет обрубить ssh ?

#197522
opryatniyav написал:
Это мне не поможет так как оно настраивается на удаленном сервере на который идет копирование, так если не будет с ним связи как он сможет обрубить ssh ?

к этой опции еще надо смотреть в сторону опции #TCPKeepAlive yes
подробности в man sshd_config

TCPKeepAlive
Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one of the machines will be properly noticed. However, this means that connections will die if the route is down temporarily, and some people find it annoying. On the other hand, if TCP keepalives are not sent, sessions may hang indefinitely on the server, leaving “ghost” users and consuming server resources. The default is “yes” (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set to “no”.

#198244

вот что вышло в итоге:

text
#!/bin/bash
#set -x
REMOTE_IP=${1}
ERROR_LOG=${REMOTE_IP}_error.log
FILE_IN=${2}
FILE_OUT=${3}
ping -c 4 $REMOTE_IP > /dev/null
if [ $? -eq 1 ]
then echo "" | mail -s "error нет связи с $REMOTE_IP" mail@co.ksoe.com.ua && exit 0
fi
if
ssh $REMOTE_IP /etc/init.d/jboss stop
sleep 30
ssh $REMOTE_IP pkill -9 -f 'jboss'
sleep 30
then ssh $REMOTE_IP pgrep -f 'jboss' >> $ERROR_LOG && \
([ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "error JBOSS не остановлен $REMOTE_IP" mail@co.ksoe.com.ua && rm -f $ERROR_LOG) && exit 0
fi
if rsync -pgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG || \
(sleep 120 ;rsync -pgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 120 ;rsync -pgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 120 ;rsync -pgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG) || \
(sleep 120 ;rsync -pgozc -e ssh ${FILE_IN} $REMOTE_IP:${FILE_OUT} 2>> $ERROR_LOG)
then ssh $REMOTE_IP /etc/init.d/jboss start 2>> $ERROR_LOG
[ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "error JBOSS не стартанул $REMOTE_IP" mail@co.ksoe.com.ua && rm -f $ERROR_LOG
else [ -s $ERROR_LOG ] && cat $ERROR_LOG | mail -s "error copy $REMOTE_IP" mail@co.ksoe.com.ua && rm -f $ERROR_LOG
fi
echo "" | mail -s "copy done $REMOTE_IP" mail@co.ksoe.com.ua
rm -f $ERROR_LOG
#set +x

и второй скриптик который запускает первый параллельно на многих серверах

text
#!/bin/bash
./rsync.sh 10.77.11.37 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.38 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.39 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.40 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.41 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.42 tmp.ear /opt/tmp.ear & \
./rsync.sh 10.77.11.43 tmp.ear /opt/tmp.ear

такой вопросик как правильно настроить полное логирование во втором скрипте?
если просто писать >> log то в нем практически нечего не отображается

#198883

можно как то вывести данные в файл которые выдает на экран команда set -x set +x ?
что то типа этого
set -x >> ALL_LOG
set +x >> ALL_LOG

Войдите или зарегистрируйтесь, чтобы ответить.