Fabric - 在单个主机

时间:2016-07-27 14:45:19

标签: python ssh parallel-processing fabric

我有一个管理脚本,我们称之为mngcntl.sh

此脚本最多可能需要 5秒才能运行。

它位于每个服务器上x个不同的位置。

我想为所有这些位置并行执行此脚本,并在不同的StringIO()实例中获取每次执行的输出。

目前的做法:

@parallel(pool_size=100)
@task
def manage(script_paths):
    output = {}
    for path in script_paths:
        fh = StringIO()
        script = path + '/' + mngcntl.sh
        run(script, stdout=fh)
        output[path] = fh.getvalue()

我的方法的问题是我必须等待每个脚本执行以运行下一个脚本。

目前,如果我在一台服务器上有x个脚本,我将在每个主机等待x * 5秒后运行此任务,理想情况下,如果这些命令并行运行,我可以等待5秒

到目前为止我尝试了什么:

  • 创建一次只接受一个脚本的任务。这需要我的池上的其他连接(每个主机每个脚本一个SSH连接),并且当我在100多台主机上运行时,实际上会增加更多的开销。
  • 使用nohup <script> &在后​​台执行每个脚本,但这样我就无法检索输出。
  • 使用nohup <script> &> <logfile>在后​​台执行每个脚本,然后稍后捕获每个日志文件并获取输出。这有效但我在为每个输出文件运行cat时遇到同样的问题(这不会并行执行)

有没有办法可以在一台主机上并行运行这些脚本而不必为每个执行的脚本ssh到每个主机?

理想情况下,我想拥有一个StringIO()实例池(或一个Queue),并拥有一个我将运行的资源multirun

multirun(list_of_cmds, stdout=list_of_fh)

0 个答案:

没有答案