Несколько экземпляров

Я в настоящее время работаю над маленьким сценарием, где я должен обновить файл на нескольких серверах, у меня есть длинный список IP моих серверов, и в настоящее время я использую ncftpput добавить файлы к серверам по одному.

Я не могу выяснить, как запустить ncftpput со следующим IP-адресом в моем списке так, чтобы у меня могло быть несколько обновлений, работающих одновременно.

Мой список является просто IP-адресами:

192.168.0.1
192.168.0.2
192.168.0.3
......
until 192.168.0.150

То, в чем я нуждаюсь, является первым ncftpput для доступа к первому IP второй IP номер два и так далее для суммы потоков, мне нужно / система может обработать.

Скажем, 10 за один раз и то, когда первый поток заканчивает его просто, берет следующий IP, НЕ взятый любым из других потоков.

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

До сих пор я делаю его этот путь: (работающий по одному)

while read ip; do
    ncftpput -c -A -u "$USER" -p "$PASSWD" "$ip" "/usr/local/program/program.conf" < "~/addthisinfo" 2>/dev/null
    if [ $? -eq 0 ]
        then
            echo -e "Here goes my succes test" >>/tmp/text_added
        else
            echo "$ip failed ! please take care of this"
    fi  
done <"$pathtoiplist""/iplist"

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

1
задан 29 July 2016 в 00:16

2 ответа

Просто поместите & символ в конце Вашего ncftpput команда, чтобы сделать, это работать в фоне и возврате сразу управляет назад к сценарию, как это:

ncftpput [...] < "~/addthisinfo" 2>/dev/null &

я опустил длинный список опций, которые Вы имели, не забывайте добавлять их назад вместо [...]

1
ответ дан 7 December 2019 в 15:51

Основываясь на ответе Командующего Байта, я предлагаю

while read ip
do
    (
    ncftpput -c -A -u "$USER" -p "$PASSWD" "$ip" "/usr/local/program/program.conf" < "~/addthisinfo"
    if [ "$?" -eq 0 ]
        then
            echo "Here goes my success test" >>/tmp/text_added
        else
            echo "$ip failed ! please take care of this"
    fi
    ) &
done < "$pathtoiplist/iplist" 2>/dev/null

Примечания:

  • Это порождает асинхронное (фон) подоболочка для каждого IP-адреса в Вашем iplist. Это позволяет оболочке обнаруживать и регистрировать отказ любого ncftpput экземпляр (процесс).
  • Вы сделали хорошее задание заключения в кавычки Ваших ссылок на переменную оболочки (например, "$ip" и "$pathtoiplist"). Но необходимо также заключить в кавычки "$?".   Строго говоря, Вы не должны заключать простые постоянные строки в кавычки как "/usr/local/program/program.conf". Но это не причиняет боль.
  • Я не уверен, хотите ли Вы действительно echo для каждого успешного вызова, и я особенно не знаю, почему Вы хотите сделать это с echo -e (когда текст сообщения не содержит обратных косых черт).
  • Вы могли бы хотеть отправить ошибку (отказ) сообщения в файл. Так как процессы работают асинхронно, Вы могли бы хотеть записать отдельные ошибочные файлы для предотвращения коллизий; например,
     echo "$ip failed ! please take care of this" > "/tmp/$ip.error"
  • Я переместился 2>/dev/null от ncftpput управляйте к циклу ( done строка) для простоты. Обратите внимание, что Вы не можете сделать этого с < "~/addthisinfo", так как Вам нужен каждый экземпляр для чтения файла независимо.
  • Я изменился "$pathtoiplist""/iplist" кому: "$pathtoiplist/iplist". Это безопасно пока первый символ после имени переменной (/, в этом случае), тот, который не позволяется в именах переменной. Я сделал то же самое с "/tmp/$ip.error", выше.
0
ответ дан 7 December 2019 в 15:51

Другие вопросы по тегам:

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