Синхронизированный SSH в backgorund - PullRequest
0 голосов
/ 19 февраля 2012

Это продолжение следующего вопроса: Выполнение команды ssh в скрипте оболочки bash в цикле

Я делаю похожую работу:

while read line
do
   ssh -n root@$line 'command'
   do something
done

Проблема в том, что я хочу выполнить часть «сделать что-то» только тогда, когда выполнение «команды» завершено в предыдущей строке ssh, т.е. я хочу дождаться завершения фонового ssh. Я могу использовать сон, но это не подходит для моего приложения. Пожалуйста, ведите меня.

Я не хочу особенно запускать ssh в фоновом режиме. Я делаю это только для того, чтобы мой цикл работал правильно. Как указано в Выполнение команды ssh в сценарии оболочки bash в цикле если мы не дадим флаг -n, цикл завершится после выполнения первой команды ssh.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Если ваша команда не выполняется в фоновом режиме, выполнение ssh server command будет ожидать ее завершения.Например, попробуйте это:

ssh server "sleep 3"
echo finished

Будет напечатано «готово» после sleep 3, фактически выполненного на удаленном сервере (т.е. через 3 секунды).

Попробуйте это - создайте три файлав ~ / tmp - вызываемые линии, parent.sh и child.sh.Для теста сделайте их на каком-нибудь компьютере с запущенным sshd, чтобы вы могли использовать ssh localhost вместо ssh server.Поместите это в них:

  • строки

    line1
    line2
    line3
    
  • parent.sh

    while read l; do
      echo next line
      ssh -n localhost "~/tmp/child.sh $l"
    done < lines
    echo parent
    
  • child.sh

    echo child processing: $1
    sleep 2
    echo child done
    

Когда вы запускаете parent:

$ cd ~/tmp
$ ./parent.sh

, вывод будет следующим:

next line
child processing: line1
child done
next line
child processing: line2
child done
next line
child processing: line3
child done
parent

, который показываетэтот потомок выполнится до того, как родитель продолжит обработку следующей строки.Вы увидите 2-секундный сон (результат выполнения sleep 2 в child.sh) между строками "child processing" и "child done".

Обратите внимание, что ssh -n не для запуска ssh в фоновом режиме - это не для потребления стандартного ввода.Для запуска ssh в фоновом режиме можно использовать ssh -f - см. man ssh.

0 голосов
/ 20 февраля 2012

Помогите мне немного погуглить:

while read line
do
   ssh root@$line 'command' < /dev/null
   do something
done

Таким образом, нет необходимости в флаге -n. Больше подробностей: http://72.14.189.113/howto/shell/while-ssh/

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