2014-10-23 2 views
0

У меня есть сервер приложений, работающих на Ubuntu 12.04, который я Запуск и остановка при помощи ниже команд -Как выполнить команду на machineA с machineX через скрипт оболочки?

Для остановки сервера

[email protected]:/opt/kml$ /opt/kml/bin/kml_start_stop.sh stop 

приложение для запуска приложения сервера

[email protected]:/opt/kml$ /opt/kml/bin/kml_start_stop.sh start 

сейчас Я пытаюсь написать сценарий оболочки, который остановит и запустит мой сервер приложений, используя приведенную выше команду, но этот сценарий оболочки будет запущен с machineX. И от machineX мы можем войти в беспарольном без ввода любого пароля для пользователя david в machineA

Например - От machineX я могу сделать ssh [email protected] без печатать свой пароль.

Ниже приведено то, что я начал. Все выглядит правильно?

#!/bin/bash 

ssh [email protected] 

/opt/kml/bin/kml_start_stop.sh stop 
sleep 10s 
/opt/kml/bin/kml_start_stop.sh start 

ответ

1

Нет, вы не можете этого сделать, потому что ssh будет входить в систему и ждать команд, тогда как вы хотите передать команды одному и тому же ssh. Сценарий должен выглядеть следующим образом:

#!/bin/bash 
while read host rest; do 
    ssh [email protected]$host <<EOF & 
    /opt/kml/bin/kml_start_stop.sh stop 
    sleep 10s 
    /opt/kml/bin/kml_start_stop.sh start 
    EOF 
done < hostlist.txt 
wait 

Это использует функцию Bash называется «документ здесь», который подает текст в поток ввода ssh процесса.

Редактировать: я добавил небольшой трюк: я закладываю каждый из заданий ssh, когда они запускаются, потому что каждый из них займет некоторое время (не менее 10 секунд из-за сна). Затем в конце я делаю wait, чтобы дождаться их завершения. Таким образом, весь скрипт может работать через 10 секунд плюс время накладных расходов, независимо от количества серверов.

+0

Большое спасибо Джону. Даже Базиль также предоставлял то же самое. Я рад, что сегодня узнал еще одно. Еще один быстрый вопрос, предположим, что у меня есть несколько машинных имен, таких как 'machineA', на которых мне нужно выполнить' /opt/kml/bin/kml_start_stop.sh stop', а затем '/ opt/kml/bin/kml_start_stop.sh' начать с тот же сценарий оболочки, который будет работать только с 'machineX'. Каков наилучший способ сделать это? Я думал сохранить все имена машин сервера приложений в файле, а затем прочитать этот файл и выполнить команду? Если возможно, можете ли вы привести пример для этого? – john

+0

@ user2809564: Я обновил свой ответ, чтобы добавить цикл, как вы просили. –

+0

Спасибо, Джон, так что этот файл 'hostList.txt' будет иметь каждую строку как имя машины? – john

1

Вы можете использовать here document выполнить удаленно некоторый скрипт:

ssh [email protected] << EOJ 
    /opt/kml/bin/kml_start_stop.sh stop 
    sleep 10 
    /opt/kml/bin/kml_start_stop.sh start 
EOJ 

в вашем случае, вы можете также выполнить несколько ssh команд и sleep локально:

ssh [email protected] /opt/kml/bin/kml_start_stop.sh stop 
sleep 10 
ssh [email protected] /opt/kml/bin/kml_start_stop.sh start 

BTW, я рекомендуем узнать больше о сценариях оболочки. Вы можете прочитать Advanced Bash Scripting Guide (с критическим глазом, у него есть недостатки) и documentation of GNU bash. В частности, чтобы сделать это на нескольких машинах, вы можете использовать цикл bash for.

+0

Большое спасибо Basile. Сегодня узнал что-то новое. Еще одна вещь, предположим, что у меня есть несколько машинных имен, таких как 'machineA', на которых мне нужно выполнить' /opt/kml/bin/kml_start_stop.sh stop', а затем '/ opt/kml/bin/kml_start_stop.sh start' из того же сценария оболочки, который будет запущен только с 'machineX'. Каков наилучший способ сделать это? Я думал сохранить все имена машин сервера приложений в файле, а затем прочитать этот файл и выполнить команду? – john

+0

В общем, у меня есть несколько машин, на которых работает сервер приложений, поэтому мне нужно выполнить команду на всех этих серверах приложений из одного сценария оболочки, запущенного с 'machineX' – john

1

Этот скрипт выполнит команды на удаленном терминале.

#!/bin/bash 

ssh [email protected] '/opt/kml/bin/kml_start_stop.sh stop && sleep 10s && /opt/kml/bin/kml_start_stop.sh start' 

В случае, если вы использовали ниже сценарий затем, отдельная SSH сессия оболочка будет порождала для подключения к удаленному компьютеру и ниже команды будут выполняться на локальной оболочке машины вместо этого на пульте

#!/bin/bash 

ssh [email protected] 
/opt/kml/bin/kml_start_stop.sh stop 
sleep 10s 
/opt/kml/bin/kml_start_stop.sh start 
+0

Это хуже, чем другие ответы здесь, потому что он открывает две отдельные сессии ssh, каждая из которых может занять значительное время, чтобы настроить WAN. –

+0

@JohnZwinck обновил мой ответ –

Смежные вопросы