Python сбой программы при запуске через службу Windows - PullRequest
0 голосов
/ 27 апреля 2020

Мой клиент предоставил мне консольное приложение Python, которое выполняет некоторую работу и записывает результат в файл .txt. Моя задача - написать сервис Windows, который читает этот конкретный файл .txt и выполняет дальнейшие действия.

Я использовал C# on. NET для написания сервиса. Мое решение содержит 3 проекта:

  • Проект уровня logi c.
  • Проект уровня обслуживания Windows.
  • Используется проект уровня тестового приложения, используемый для отладки и других целей.

Как на уровне службы Windows, так и на уровне тестового приложения используется уровень logi c для основных функций. Когда я запускаю приложение через тестовый уровень, все работает отлично, но всякий раз, когда я пытаюсь запустить приложение через службу, автономное приложение Python, которое запускает служба, не записывает никаких выходных файлов. Я мог видеть, что приложение Python работает в диспетчере задач, но нигде не выводится. Я полагаю, что код Python дает сбой, но я не могу получить точную причину.

Я пробовал следующие способы отладки проблемы:

  • Поиск Windows и System32 каталоги для любых связанных выходных файлов, просто чтобы рассмотреть возможность того, чтобы служба имела эти каталоги в качестве рабочего каталога по умолчанию.
  • Использовали абсолютные пути в коде службы, чтобы убедиться, что Python часть не записывает выходные файлы в какое-то неизвестное место.
  • Если клиентский инструмент передал выходной каталог в код Python через аргументы командной строки.
  • Написал фиктивное консольное приложение в C# который пишет файл, пытался вызвать его через службу, но он работал нормально и записал файл, как и ожидалось.
  • Подозревал, что стандартный ввод-вывод может привести к тому, что приложение Python обработает sh и, таким образом, использовал стандартный ввод-вывод в моей фиктивной программе, но он работал без проблем.
  • Попытка дать длинное задание коду Python, который должен был Чтобы выполнить полностью, потребуется около 30 минут, но скрипт Python запустился и немедленно закрылся, что, по сути, является надежным доказательством теории о том, что в какой-то момент происходит сбой.
  • Попытка запустить службу с моим невысоким Windows пользователь вместо Local System pseudouser.
  • Попробовал настроить службу для возможности взаимодействия с рабочим столом.

У меня тут нет идей. В каком направлении мне следует искать?

Просто примечание, если это важно: я использую System.Diagnostics.Process для запуска сценария Python.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Благодаря помощи timhowarduk я наконец смог найти причину проблемы root. python script искал файл конфигурации, а когда он работал из службы Windows, он искал этот файл конфигурации в System32.

Все службы windows запускаются из System32.

Из-за вышеизложенного скрипт python выполняет поиск в System32, так как он был работает как часть службы windows. Я думаю, я мог бы просто попросить клиента отредактировать скрипт python для чтения конфигурации из каталога приложения-службы windows.

0 голосов
/ 27 апреля 2020

Если это работает из вашего тестового приложения, это звучит как проблема с разрешениями. В каком контексте безопасности / пользователя работает служба windows, и имеет ли этот пользователь разрешение на запись в файловую систему, где вы ожидаете этого? Вы пытались использовать полный путь к выходному файлу, чтобы убедиться, где он ожидается?

Я был бы склонен написать крошечное python приложение, которое просто сохраняет «привет мир» в файл, и заставить его работать из службы windows, а затем собрать его оттуда.

...