Синхронизированный ssh в backgorund

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

Я выполняю аналогичную работу:

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

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

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

2 ответа

Мне немного помочь в поисковых системах:

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

Таким образом, не требуется флаг -n. Для получения дополнительной информации: http://72.14.189.113/howto/shell/while-ssh/


Если ваша команда не выполняется в фоновом режиме, выполнение команды 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

Когда вы запускаете родителя:

$ 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) между строками "обработка ребенка" и "дочерние".

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

licensed under cc by-sa 3.0 with attribution.