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

In what scenarios port being used by a process don't show up in netstat -a output.

Si todo funciona correctamente, nunca. Como se mencionó anteriormente, podría reemplazar su número de puerto por el nombre del servicio como se indica en /etc/services.

El uso de netstat -nagarantiza que los puertos de servicio no se traduzcan a nombres de servicio.

1
13.04.2017, 15:36
2 ответа
logdir=`mktemp -d`
bunch=200

IFS=$'\n'
for hosts in $(< hosts.lst xargs -r -L "$bunch"); do
   IFS=" ";
   for host in $hosts; do
      ssh -n -o BatchMode=yes "$host" './runScript.sh' 1>"$logdir/$host.log" 2>&1 &
   done
   wait
done

Предполагая, что тысячи (тысячи) хостов перечислены одна / строка в файле hosts.lst , а затем из них за один раз выбирается группа (200), и на каждом из этих 200 хостов создается ваш runScript.sh с использованием ssh в пакетном режиме и в то же время с сохранением stdout + stderr извергается из каждого из этих фоновых заданий в файл с именем host в каталоге $ logdir , который может быть исследован по мере необходимости.

Наконец, мы ждем завершения одной группы перед запуском следующей группы с помощью команды wait в конце внутреннего цикла for .

6
29.04.2021, 00:02

Следующая модификация вашего скрипта, не требующая каких-либо других утилит, будет выполняться параллельно, но может иметь ограничения в зависимости от ограничений ваших хостов на дескрипторы открытых файлов:

for f in $(cat host.lst); do
       ./runScript.sh $f &
done

Для записи результатов в журнал , просто добавьте > run.log после done , чтобы сохранить в новый файл, run.log .

Ключевым изменением является добавление & , которые запускают процесс в фоновом режиме, а не ожидают его завершения перед выполнением следующей команды.

2
29.04.2021, 00:02

Теги

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