Запускать один и тот же сценарий на нескольких серверах через SSH

Ну, я сказал бы, что "Вы не можете сделать этого", прежде чем я погуглил этот stackoverflow вопрос. Кажется, что можно использовать gdb звонить waitpid() системный вызов в родительском процессе процесса-зомби. Хороший прием.

Мой совет не состоит в том, чтобы сделать этого: независимо от того, что "lightdm", он, вероятно, моется после дочерних процессов, из которых выходят, время от времени, или возможно он предполагает, что делает. Если Вы делаете waitpid() с gdb, можно полить из шланга lightdm.

4
09.09.2015, 00:21
4 ответа

Для этого есть несколько решений - вы хотите сохранить ручное управление шагами и просто выполнять их одновременно? Посмотрите на CSSH (если вы используете систему Linux) или SuperPutty (если вы используете систему Windows). Если вы просто хотите все автоматизировать, посмотрите Ожидайте .

4
27.01.2020, 20:46

@Dave

В зависимости от сценария вы можете запустить все через ssh:

for server in s1 s2 s3; do
    ssh $server "command one; command two; ..."
done

Или разделить его на несколько вызовов:

for server in s1 s2 s3; do
    ssh $server command one
    ssh $server command two
    ...
done

Не стесняйтесь добавить это к вашему ответу, просто проходя мимо ...

4
27.01.2020, 20:46

Сделайте себе одолжение и проверьте Доступно . Похоже, это именно то, что вам нужно. Он использует SSH и легко масштабируется, все, что вам нужно сделать, это добавить серверы в список по мере необходимости. Научившись делать книгу воспроизведения, вы сэкономите бесчисленное количество часов в будущем.

3
27.01.2020, 20:46

Другой вопрос конкретно спрашивает, как "получить текущее время в секундах после Эпохи". Формат даты и аргументы описаны в руководстве bash (прокрутите вниз до printf ):

% (datefmt) T 

Вызывает printf вывод строки даты-времени в результате использования datefmt в качестве строки формата для strftime (3). Соответствующий аргумент - целое число, представляющее количество секунд с начала эпохи. Два могут использоваться специальные значения аргументов: -1 представляет текущее время, и -2 представляет время вызова оболочки. Если аргумент отсутствует указанное преобразование ведет себя так, как если бы было задано значение -1 . Это - исключение из обычного поведения printf .

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


, если не используются специальные значения ( -1 или -2 ) или не используется аргумент (и в этом случае по умолчанию используется значение -1 )

-121--111418-
  1. Монтируйте USB in/mnt: mount/ dev/your_USB/mnt
  2. mount --bind/dev/mnt/dev
  3. mount --bind/proc/mnt/proc
  4. mount --bind/sys
  5. chroot/mnt
  6. Изменение конфигурационных файлов GRUB
  7. grub-mkconfig
-121--150284-

Как уже упоминалось, существуют инструменты, предназначенные для управления несколькими машинами, но для простого решения bash можно написать цикл для и выполнить команды через ssh на нескольких узлах.

Предполагая, что host1 и host2 являются именами хостов ndoes, от которых вы хотите это сделать:

for node in host1 host2; do
    scp /tmp/script.sh user@$node:/tmp/script.sh
    if [[ "$?" == "0" ]];then #checks that last command didn't return an error
        ssh -oBatchMode=yes user@$node /tmp/script.sh
    fi
done

Если вы собираетесь использовать это решение, я рекомендую настроить ключи ssh так, чтобы вам не приходилось вводить пароль каждый раз. Параметр BatchMode приведет к пропуску сценария, а не к ожиданию ввода. Можно решить, является ли это предпочтительным.

3
27.01.2020, 20:46

Теги

Похожие вопросы