Mamy polecenie w języku Python, które działa równolegle na kilku hostach, mniej więcej tak:
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
Spowoduje to skopiowanie pamięci podręcznej na serwery produkcyjne wymienione równolegle. W trakcie tego procesu występuje różne rejestrowanie, które wskazuje, jak daleko jesteśmy, ponieważ katalogi pamięci podręcznej XXgig mogą zająć wiele godzin. Ponieważ kopiowanie odbywa się jednocześnie, dane wyjściowe po uruchomieniu w wierszu poleceń wracają z przeplotem w czasie rzeczywistym, tak jak poniżej:
[prod1.server] Executing task 'nginx_cache_copy'
[prod2.server] Executing task 'nginx_cache_copy'
[prod3.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.688243
[prod1.server] INFO: rsyncing cache dir
[prod1.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.716345
[prod2.server] INFO: rsyncing cache dir
[prod2.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.853275
[prod3.server] INFO: rsyncing cache dir
[prod3.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.984154
[prod1.server] INFO: Reloading nginx config
[prod1.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.025155
[prod2.server] INFO: Reloading nginx config
[prod2.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.100169
[prod1.server] SUCCESS: CACHE COPY COMPLETE
2014-09-16 10:02:30.181938
[prod2.server] SUCCESS: CACHE COPY COMPLETE
2014-09-16 10:02:30.331402
[prod3.server] INFO: Reloading nginx config
[prod3.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.559271
[prod3.server] SUCCESS: CACHE COPY COMPLETE
Done.
Jednak po uruchomieniu zadania przez Jenkins dane wyjściowe konsoli nie są wyświetlane, dopóki wszystkie zadania nie zostaną wykonane, ponieważ Jenkins grupuje dane wyjściowe PO połączeniu wątków po zakończeniu wszystkich wątków. Tak więc po zakończeniu wszystkich poleceń dane wyjściowe wyglądają następująco:
[prod1.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.688243
[prod1.server] INFO: rsyncing cache dir
[prod1.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:29.984154
[prod1.server] INFO: Reloading nginx config
[prod1.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.100169
[prod1.server] SUCCESS: CACHE COPY COMPLETE
[prod2.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.716345
[prod2.server] INFO: rsyncing cache dir
[prod2.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:30.025155
[prod2.server] INFO: Reloading nginx config
[prod2.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.181938
[prod2.server] SUCCESS: CACHE COPY COMPLETE
[prod3.server] Executing task 'nginx_cache_copy'
2014-09-16 10:02:29.853275
[prod3.server] INFO: rsyncing cache dir
[prod3.server] run: rsync -a -q cache.server:"repo/cache/some.site.com" \
"repo/cache/."
2014-09-16 10:02:30.331402
[prod3.server] INFO: Reloading nginx config
[prod3.server] run: sbin/nginx -s reload -c "repo/nginx.conf"
2014-09-16 10:02:30.559271
[prod3.server] SUCCESS: CACHE COPY COMPLETE
Done.
Chociaż jest to bardziej czytelne, nie jest idealne, ponieważ chcielibyśmy śledzić stan procesu, czytając dane wyjściowe konsoli w czasie rzeczywistym. Zauważ, że gdy ta komenda tkanina jest prowadzony bez tej --parallel
opcji wyjście konsola ma pojawić się w czasie rzeczywistym , jednak oczywiście nie jest to wykonalne, ponieważ proces seryjny trwa znacznie dłużej biec.
Nie udało mi się znaleźć ustawienia w Jenkins, które wyłączy to grupowanie wątków. Czy ktoś ma jakieś pomysły?
VarChar
piekł Charcoal Black - Czy jesteś zadowolony z Superuser.com pomagając udzielić odpowiedzi na to pytanie? Czy nadal potrzebujesz dodatkowej uwagi? Być może są jeszcze inne opcje, które możemy dla Ciebie zbadać. Możesz rozważyć zmianę tytułu na coś bardziej atrakcyjnego, aby zwrócić na siebie uwagę, na przykład jako szybką taktykę myślową, którą możesz zastosować; jaka jest szkoda w próbach.
PYTHONUNBUFFERED=1 && fab ...
trochę pomaga, pokazując każdy serwer jako ukończony, zamiast czekać na ukończenie wszystkich. Nadal chciałbym znaleźć rozwiązanie w czasie rzeczywistym.