在Linux中,如何使用ssh和Expect在远程服务器执行期间监视shell脚本的进度

时间:2019-01-29 07:36:55

标签: linux bash ssh expect

我在shell脚本connect.sh中有以下代码。远程脚本将至少花费1个小时来完成执行。只有在远程脚本执行完成后,我必须等待一个小时,我才能在$local_dir/file.tmp中看到以下脚本的输出。

如何在执行期间监视远程脚本并行的输出/进度?

connect.sh

#!/bin/bash 
local_dir="/scratch"

/usr/bin/expect > "$local_dir/file.tmp" << EOF

    set timeout -1
    spawn ssh -o "StrictHostKeyChecking no" "user@host" "cd /u01; ./remote_script.py arg1 arg2 arg3 arg4" 
    expect "user@host's password:"
    send "$pwd\r"
    expect "*#*"
EOF

2 个答案:

答案 0 :(得分:0)

日志将收集remote_script.py打印的所有内容。会有缓冲,因此,如果只打印几行,则直到作业完成或编写器强行刷新缓冲区后,您才会看到它们。

作为一种变通方法,可以更改remote_script.py,以便将进度报告打印为标准错误。 Python logging模块使这一过程变得简单直观。

import logging

def main():
    logging.info('Starting up ...')
    # Do startup stuff
    for n in range(100000):
        if n % 10000 == 0:
            logging.info('Progress: {0}/100000'.format(n))
        # do more things in each iteration

if __name__ == '__main__':
    logging.basicConfig(level=logging.INFO,
        format='%(module)s:%(asctime)s:%(message)s')
    main()

答案 1 :(得分:0)

expect必须缓冲其输出以匹配模式。

您可以定义缓冲区大小,并在缓冲区填满时采取措施。像这样:

set match_max 4096    ;# or some other value, not too small
expect {
    full_buffer {
        puts -nonewline "."
        fflush stdout
        exp_continue
    }
    "#" {puts ""}
}
send "exit\r"
expect eof

应该为看到的每4K数据打印一个点,这是一种进度条。但是您尚未共享远程脚本生成的数据量,因此这确实是一个暗中的刺探。