【问题标题】:How to not wait for the output of the remote execution?如何不等待远程执行的输出?
【发布时间】:2021-01-11 19:55:49
【问题描述】:

我正在使用pysftp进行远程执行,问题是我不想等待远程执行的输出,我只想开始执行并完成它。

import pysftp as sftp
cnopts = sftp.CnOpts()
cnopts.hostkeys = None
handle = sftp.Connection('10.0.2.10',username='kali', password='root', cnopts=cnopts)
handle.execute('/tmp/doThis')
handle.exeute('/tmp/doThat')

现在的问题是脚本正在等待 doThis 结束,然后它以 doThat 开始。我尝试使用'&',但它没有影响。 有没有办法做到这一点,还是不可能?

【问题讨论】:

    标签: python python-3.x paramiko pysftp remote-execution


    【解决方案1】:

    您为什么不试试threading 的概念?

    import pysftp as sftp
    from threading import Thread
    cnopts = sftp.CnOpts()
    cnopts.hostkeys = None
    handle = sftp.Connection('10.0.2.10',username='kali', password='root', cnopts=cnopts)
    
    def exec(cmd):
        #handle will be taken from the prev declaration
        handle.execute(cmd)
    
    list_cmds = ['/tmp/doThis', '/tmp/doThat']
    
    for cmd in list_cmds:
        Thread(target=exec, args=[cmd]).start()
    

    【讨论】:

    • 我只是不想停止等待,但我不想在我的计算机上执行该过程。一旦我在远程计算机上启动该过程,它根本不应该与我的计算机相关。但是如果我创建一个进程,它将在后台运行。
    • 是的,不会的!关键是您在这里创建了一个线程,并且控制权在您管理创建的线程(在您的 RAM 中)时,但该进程显然将在远程机器上运行。希望这是您所期待的。
    • 感谢您的意见,我会实施并让您知道它是否有效。
    【解决方案2】:

    一种选择是使用multiprocessing 模块为每个execute 语句启动一个新进程(有关文档,请参阅here)。您使用Process 构造函数创建一个进程,给它一个要执行的目标函数和任何参数,并告诉它使用start 方法启动它的函数。如果要等待进程完成,请使用该函数的 join 方法。您的代码可能看起来像这样(确保您的语句包含在 if __name__ == '__main__': 块中):

    import pysftp as sftp
    from multiprocessing import Process
    
    
    if __name__ == '__main__':
        cnopts = sftp.CnOpts()
        cnopts.hostkeys = None
        handle = sftp.Connection(
            '10.0.2.10',
            username='kali',
            password='root',
            cnopts=cnopts
        )
        # Create processes
        p1 = Process(target=handle.execute, args=('/tmp/doThis',))
        p2 = Process(target=handle.execute, args=('/tmp/doThat',))
        # Tell processes to start
        p1.start()
        p2.start()
        # If you want to, then wait for both processes to finish
        p1.join()
        p2.join()
    
    

    【讨论】:

    • 我只是不想停止等待,但我不想在我的计算机上执行该过程。一旦我在远程计算机上启动该过程,它根本不应该与我的计算机相关。但是如果我创建一个进程,它将在后台运行。
    猜你喜欢
    • 2019-12-15
    • 2015-01-27
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多