Вопрос: Я пытаюсь создать службу, которая загружает einige журналы файлов с помощью SFTP и импортирует их в базу данных. Так как Delphi не имеет компонентов SFTP, я создал файл BAT для загрузки журналов с помощью WinSCP. Однако, когда я запускаю службу, она замораживается при вызове CMD.exe. Почему это происходит и как это исправить?
Ответ: Проблема заключается в том, что ваш скрипт не содержит ключа хоста SSH. Кроме того, из-за странного способа предоставления команд (перенаправление ввода вместо переключений /script или /command), WinSCP запускается в интерактивном режиме и запрашивает подтверждение ключа хоста, в результате чего он замораживается.
Чтобы решить эту проблему, добавьте переключение -hostkey в команду open. См. раздел «Верификация ключа хоста в скрипте» и «Моя скрипт работает нормально, когда запускается вручную, но терпит сбой или замораживается, когда запускается по расписанию, SSIS или другой службой автоматизации. Что я делаю не так?». Кроме того, используйте переключения /script или /command, чтобы сделать WinSCP прерывистым на любых проблемах, а не замораживаться. Также читайте вывод файла batch для лучшей обработки ошибок в будущем.
Пример кода на Object Pascal (Delphi) для вызова WinSCP из службы:
function TdmCentralita.DownloadLogs(SaveOutput: boolean = False): boolean;
var
IniFile: TIniFile;
Path, Params, User, Password, Server, Hostkey, RemotePath: string;
begin
IniFile := TIniFile.Create(TPath.ChangeExtension(GetModuleName(HInstance), '.ini'));
Server := IniFile.ReadString('Centralita', 'Servidor', '');
Hostkey := IniFile.ReadString('Centralita', 'Hostkey', '');
User := IniFile.ReadString('Centralita', 'Usuario', 'root');
Password := DecryptStr(IniFile.ReadString('Centralita', 'Password', ''), 223);
RemotePath := IniFile.ReadString('Centralita', 'PathRemoto', '');
IniFile.Free;
while (RightStr(RemotePath, 1) = '\') or (RightStr(RemotePath, 1) = '/') do
RemotePath := Copy(RemotePath, 1, Length(RemotePath) - 1);
RemotePath := RemotePath + '/*.log';
Path := TPath.Combine(TPath.GetDirectoryName(GetModuleName(HInstance)), 'SFTP');
if not TDirectory.Exists(TPath.Combine(Path, 'files')) then
TDirectory.CreateDirectory(TPath.Combine(Path, 'files'));
Params := '/ini=null /command "open sftp://' + User + ':' + Password + '@' + Server + ' -hostkey=""' + Hostkey + '""" "option confirm off" "get -delete ' + RemotePath + ' files\*" "exit"';
if SaveOutput then
Params := Params + ' /log="' + Path + '\Log.txt" /loglevel=0';
ExecAppWait('WinSCP.com', Params, Path, True);
Result := Length(TDirectory.GetFiles(TPath.Combine(Path, 'Files'), '*.log')) > 0;
end;
Примечание: Убедитесь, что у службы есть необходимые разрешения для доступа к файлам и выполнения команды WinSCP.
Вопрос пользователя связан со службой, которая замораживается при вызове CMD.exe во время попытки загрузить журналы с помощью SFTP и импортировать их в базу данных. Пользователь создал файл BAT для загрузки журналов с помощью WinSCP, но служба замораживае
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.