如何远程执行和监视长时间运行的过程以及如何在完成之前查看输出

时间:2018-07-20 05:01:50

标签: python-3.x ssh stdout openssh parallel-ssh

如何在远程计算机上执行进程并在退出之前查看标准输出? ssh是理想选择,但仅在远程命令完成后才报告输出。

这样的示例python脚本:

#!/usr/bin/python3
import time

tStart = time.time()
elapsedTime=0

while elapsedTime<10000:
    time.sleep(2)
    elapsedTime = time.time() - tStart
    print('elapsed time: {0:6.2f}(s)'.format(elapsedTime))

生成指示进度的输出:

elapsed time:   2.00(s)
elapsed time:   4.00(s)
elapsed time:   6.00(s)
elapsed time:   8.00(s)
...

我想在使用ssh的远程计算机上运行它:

ssh vector /home/comperem/myProc.py

此过程不会持续几分钟或几个小时,我需要在运行过程中对其进行监视。

在远程过程完成之前,如何获得ssh或类似的命令来远程运行命令并向本地控制台报告stdout?每行之后的输出将很有用。

2 个答案:

答案 0 :(得分:0)

ssh vector /home/comperem/myProc.py

以这种方式通过ssh调用远程程序时,默认情况下,远程进程在没有TTY的情况下运行。相反,它通过一组管道连接到ssh服务器。您的python程序可能正在缓冲其输出,因为它正在写入管道而不是TTY。

最简单的解决方法是让程序刷新其输出。 This question讨论了如何获取python脚本刷新标准输出。我不是python程序员,但是看起来应该可以:

while elapsedTime<10000:
    time.sleep(2)
    elapsedTime = time.time() - tStart
    print('elapsed time: {0:6.2f}(s)'.format(elapsedTime), flush=True)
                                                         ^^^^^^^^^^^^

The other question讨论了其他方法。

答案 1 :(得分:0)

您可以使用daggy解决问题:

  1. 像这样创建数据聚合配置config.yaml
aliases:
 - &myProc
   name: myProc
   command: tail -f /home/comperem/myProc.py
   extension: log
 - &auth_ssh
   login: user
   password: password

sources:
   host1:
     type: ssh
     connection:
       *auth_ssh
     host: 192.168.1.10
     commands:
       - *myProc
    hostN:
     type: ssh
     connection:
       *auth_ssh
     host: 192.168.1.N
     commands:
       - *myProc
  1. 运行daggy -o my_proc_folder config.yaml
  2. 运行tail -f my_proc_folder/*