В Linux, как отслеживать ход выполнения сценария оболочки во время выполнения на удаленном сервере, используя ssh и ожидайте - PullRequest
0 голосов
/ 29 января 2019

У меня есть код ниже в сценарии оболочки 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 голосов
/ 29 января 2019

ожидаемо должен буферизовать свои выходные данные для соответствия шаблонам.

Вы можете определить размер буфера и предпринять действия, когда буфер заполнится.Например:

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

Это будет , должно напечатать точку для каждого 4К данных, что является своего рода индикатором выполнения.Но вы не поделились тем, сколько данных генерирует удаленный скрипт, так что это действительно удар в темноте.

0 голосов
/ 29 января 2019

Журнал будет собирать все, что напечатано 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()
...