Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему служба замораживается при вызове CMD.exe

Delphi , Интернет и Сети , FTP

Заголовок:

Вопрос: Я пытаюсь создать службу, которая загружает 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: FTP ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 17:14:06
2025-10-17 23:30:57/0.011476993560791/0