Основные различия при запуске приложения в качестве службы заключаются в среде.
Некоторые особенности, в частности:
Какой пользователь запускает службу как.
Когда вы запускаете его из командной строки, он, вероятно, работает как ваша учетная запись пользователя.Ваша учетная запись пользователя, скорее всего, будет иметь другие разрешения, чем системная учетная запись Windows.Это приводит к проблемам с доступом к файлам больше, чем, например, к открытию порта для HTTP-сервера.Могут быть и другие проблемы, связанные с разрешениями.
Переменные среды, включая PATH.
Когда вы находитесь в командной оболочке, в Windows есть переменная PATH, которая указывает, где искатьисполняемые файлы.Поэтому, если вы наберете python
, он ищет python.exe
в текущей папке, а затем ищет переменную PATH, пока не найдет python.exe
У вас также есть другие переменные окружения, которые можно определить, такие как TMP(временная папка) и т. д.
Когда он работает как служба, он обычно работает в другом пользовательском контексте, который будет иметь разные переменные среды, как% TMP%, так и PATH.Таким образом, одна вещь, которая могла бы произойти, это то, что она пытается запустить python.exe
, но нет пути python.exe
для пользователя службы.
Запись реестра HKCU
Если ваше приложение использует реестр и использует дерево HKEY_CURRENT_USER, оно, вероятно, отличается, когда оно работает как служба.(HKEY_CURRENT_MACHINE, вероятно, то же самое).
Папка, в которой запускается приложение
Когда вы запускаете его из командной строки, вы обычно запускаете его в текущей папке.Это означает, что можно использовать относительные пути (например, .\images
) вместо абсолютных путей (c:\website\images
).
Если вы перейдете в другую папку, версия .\images
может не работать.
Когда программа запускается как служба, обычно она запускается в C:\Windows\System32
Таким образом, вы можете выяснить, работает ли использование абсолютных путей.Или вы можете выяснить, существует ли способ указать папку для запуска.
Еще одна вещь, которую нужно проверить (возможно, сначала) - найдите файл журнала
Обычно веб-серверы пишутфайл журнала на сервере где-то.
Ошибка 500 будет отправлена пользователю, но в журнал будет записана более подробная ошибка.Так что найдите, где должен быть этот лог-файл, и проверьте его.(Возможно, это не там, где должно быть, и это может быть связано с разрешениями, связанными с пользователем, от имени которого работает служба).Если это так, это может помочь отследить конкретную проблему.