сценарий оболочки, для цикла, SSH и псевдоним - PullRequest
1 голос
/ 05 декабря 2011

Я пытаюсь сделать что-то вроде этого, мне нужно взять резервную копию с 4 лезвий, и все должно храниться в папке /home/backup/esa, которая содержит 4 каталоги с именами узлов (например, sc-1, sc-2, pl-1, pl-2). каждый каталог должен содержать информацию о резервном копировании соответствующего узла.

Но я вижу, что "с какого узла я выполняю команду, только эти данные скопированы во все 4 директории ". Есть идеи, почему это происходит? Мой скрипт такой:

for node in $(grep "^node" /cluster/etc/cluster.conf | awk '{print $4}');
do echo "Creating backup fornode ${node}";
ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};
done

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Ваша проблема в следующем фрагменте кода:

ssh $node source /etc/profile.d/bkUp.sh;
asBackup -b /home/backup/esa/${node};

Это делает:

  1. Создать удаленную оболочку на $node
  2. Выполнить командуsource /etc/profile.d/bkUp.sh в удаленной оболочке
  3. Закройте удаленную оболочку и забудьте обо всем, что сделано в этой оболочке !!
  4. Запустите asBackup на локальном хосте.

Это не то, что вы хотите.Измените его на:

ssh "$node" "source /etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}'"

Это делает:

  1. Создать удаленную оболочку на $node
  2. Выполнить команду (и) source /etc/profile.d/bkUp.sh; asBackup -b '/home/backup/esa/${node}' на удаленный хост

Убедитесь, что /home/backup/esa/${node} - это монтирование NFS (в противном случае файлы будут сохранены только в каталоге на хосте remote ).

Обратите внимание, что /etc/profile очень плохое место для скриптов резервного копирования (или их конфигурации).Попробуйте переместить setup / config в /home/backup/esa, который (или должен) использоваться всеми узлами кластера, поэтому изменение его в одном месте обновляет его везде сразу.

Также обратите внимание на использование кавычек:Одинарные и двойные кавычки гарантируют, что пробелы в переменной node не вызовут неожиданных проблем.Конечно, очень маловероятно, что в «$ node» будут пробелы, но если они есть, сообщение об ошибке введет вас в заблуждение.

Поэтому всегда указывайте правильно.

1 голос
/ 05 декабря 2011

Форматирование вашего вопроса немного сбивает с толку, но похоже, что у вас есть проблема с цитированием.Если вы выполните

ssh $node source /etc/profile.d/bkUp.sh; esaBackup -b /home/backup/esa/${node}

, то команда source будет выполнена на $node.После завершения команды удаленное соединение закрывается, а вместе с ним и оболочка, содержащая результат поиска /etc/profile.d/bkUp.sh.Теперь команда esaBackup запускается на локальной машине.Он не увидит ничего, что вы храните в `bkUp.sh

. Все, что вам нужно сделать, это заключить в кавычки все команды, которые вы хотите запустить в удаленной оболочке - что-то вроде

ssh $node "source /etc/profile.d/bkUp.sh; esaBackup -b /home/backup/esa/${node}"

Это заставит ssh выполнить полный список команд на удаленном узле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...