Обнаружение тайм-аута FTP в пакетном сценарии Windows

У меня есть задание агента SQL Server, которое планируется запускать ежедневно. Первый из двух шагов вызывает пакет SSIS, который записывает результаты запроса в файл. На втором этапе выполняется пакетный файл, который переименовывает файл, добавляя дату, загружает файл на FTP-сайт партнера, перемещает файл в каталог архива и очищает. Обычно это работает нормально.

Однако иногда уведомление об успешном завершении задания не отправляется. Когда я захожу на сервер, я вижу, что ftp.exe все еще работает, но файл не загружен и не перемещен в архив. Когда я завершаю процесс FTP, задание продолжается, перемещая файл и очищая его. Взгляд на историю работы показывает два разных сценария в этих неудачных случаях. Во-первых, соединение установлено, но последним видимым выводом FTP является 150 Opening data channel for file transfer.226 Transfer OK не существует, так как это означает успешное выполнение задания. Второй сценарий заключается в том, что соединение никогда не устанавливается, поэтому сценарий отключается и пытается войти в систему, когда соединение не открыто.

Вот скрипт с измененными хостом, пользователем и паролем:

@echo off
setlocal

D:
cd D:\Backups

set file_name=ssis_output.txt
set new_file_name=SDCL.%date:~-4,4%-%date:~-10,2%-%date:~-7,2%-00-00-00.txt

set user=XXXXXXXXXXXXX
set pass=XXXXXXXXXXXXX
set host=XXXXXXXXXXXXX

ren "%file_name%" "%new_file_name%"

echo user %user%> ftpcmd.dat
echo %pass%>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %new_file_name%>> ftpcmd.dat
echo close>> ftpcmd.dat
echo bye>> ftpcmd.dat
ftp -n -s:ftpcmd.dat %host%
del ftpcmd.dat
move %new_file_name% data_files

Что я хотел бы сделать, так это найти способ включить обнаружение ошибок в пакетный файл, чтобы, если FTP-соединение либо не было установлено, либо истекло время ожидания до завершения передачи, сценарий распознал это и дал сбой, что позволяет завершить задание. и отправить соответствующее уведомление. Еще лучше, если сбой соединения приведет к нескольким дополнительным попыткам после соответствующих пауз, прежде чем, наконец, сдаться и сообщить об ошибке.

EDIT: я не возражаю против установки другого бесплатного FTP-клиента, такого как WinSCP, если это поможет найти решение.


person mdoyle    schedule 10.05.2013    source источник


Ответы (2)


Я провел выходные в поисках способа заставить FTP-клиент Windows закрыться при сбое подключения, но не смог ничего найти. Я почти уверен, что это невозможно. Вместо этого я установил WinSCP, который имеет консольный режим и прилично поддерживает сценарии. У него есть параметр reconnecttime, который позволяет указать количество секунд, в течение которых процесс будет ждать перед попыткой повторного подключения. При тестировании задание было выполнено успешно, даже когда я несколько раз отключал сеанс FTP со стороны сервера. Постоянное отключение привело к выходу программы с кодом выхода 1, что достаточно для того, чтобы агент SQL Server обнаружил, что задание не выполнено, и уведомил нас об этом.

Однако WinSCP не кажется последовательным в обработке отключений. В некоторых испытаниях второе отключение сеанса приводило к выходу программы с 1, в то время как в других оно повторно подключалось после многих отключений. Я остановился на этих настройках как на тех, которые максимизируют вероятность повторных подключений и успешного завершения работы:

option batch on
option reconnecttime 30
option confirm off
person mdoyle    schedule 13.05.2013

Может быть немного поздно для ОП. Но для регистрации FTP вы могли бы записывать подтверждение в файл журнала каждый раз, когда он загружает файл. Затем, после завершения сценария, проверьте файл журнала, чтобы убедиться, что передача завершена успешно. Если это не так, возобновите его с последнего известного переданного файла. Тем не менее, это может быть довольно запутанный цикл для пакетного сценария.

person user2863294    schedule 31.10.2013