我们有一个可以在多个主机上并行运行的Python fabric命令,如下所示:
$ fab --hosts=prod1.server,prod2.server,prod3.server --parallel copy_cache
这会将缓存复制到并行列出的生产服务器。在整个过程中会发生各种日志记录,以表明我们的进展情况,因为XXgig缓存目录可能要花费数小时。由于复制是同时进行的,因此在命令行上运行时,输出会实时返回隔行扫描,如下所示:
[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.
但是,当通过Jenkins运行任务时,直到所有任务完成后才显示控制台输出,因为在所有线程完成后,在线程加入后,Jenkins将输出分组。因此,所有命令完成后,输出将如下所示:
[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.
尽管这更具可读性,但它并不理想,因为我们希望通过实时读取控制台输出来跟踪进程状态。请注意,在不带该--parallel
选项的情况下运行该结构命令时,控制台输出确实会实时发生,但是显然这是行不通的,因为串行过程需要更长的时间才能运行。
我无法在Jenkins中找到将禁用此线程分组的设置。有人有什么想法吗?
我投票结束这个问题是因为离题,因为它似乎更适合服务器故障
—
Tamara Wijsman
您是否尝试过在Unix命令前加上“ stdbuf -oL”?
—
strobelight
VarChar
炭黑炭先生-您对Superuser.com帮助您回答这个问题的满意程度如何?您是否还需要其他关注?也许我们可以为您探索更多选择。您可能会考虑将标题更改为更吸引人的名称,例如可以应用的一种快速思考策略;尝试有什么害处。
我投票关闭这个问题作为离题,因为它在这里没有得到令人满意的答案,并且可能在ServerFault上得到更多/更好的关注。
—
music2myear
PYTHONUNBUFFERED=1 && fab ...
通过在每个服务器完成时显示它们而不是等待所有服务器完成来运行会有所帮助。不过还是想找到一个完全实时的解决方案。