Windows Служба на основе python не запускается - не вернула ошибку - PullRequest
0 голосов
/ 07 мая 2020

Почему этот вопрос?

Будучи новичком в программировании с помощью служб windows, я и мой коллега не смогли запустить нашу службу с помощью команды net start. В конце концов мы обнаружили проблему, которая позволила запустить службу, но мне не хватает понимания того, почему наше решение сработало, я считаю, что другие тоже могут столкнуться с этой проблемой, поэтому я публикую вопрос и ответ, который описывает, как мы решили нашу ситуацию, я надеюсь другие, более опытные и знающие, дадут более полные ответы. запускается, но не возвращает ошибку.

Самой сложной частью этой проблемы, которую нам пришлось преодолеть, было отсутствие возврата ошибки, мы просмотрели журнал событий, командную строку, в которой использовалась команда net start, но информации об ошибке не было. быть иметь.

Подробности проблемы

Проблема возникла при попытке создать службу windows на основе модуля python, мы использовали метод, предоставленный здесь , чтобы установить windows, использующий наш модуль python.

Запуск такой службы сработал (подробнее о запуске здесь )

python service_definition.py debug

Код в service_definintion.py взят из примеров в ссылки выше, повторяются ниже

import time
import random
from pathlib import Path
from SMWinservice import SMWinservice
import cress
from cress import server_interface
import sys 

class server_interface_backgndproc(SMWinservice):
    _svc_name_ = "server_interface_backgndproc"
    _svc_display_name_ = "CrowdRender SIP"
    _svc_description_ = "CrowdRender Server Interface Process"

    def start(self):
        self.isrunning = True
        sys.argv.append(["--",
                    # "--cr_session_type", 'agent',
                    "--cr_cress_mode", "SIP",
                    ])


    def stop(self):
        self.isrunning = False

    def main(self):
        i = 0
        ## while self.isrunning:
        server_interface.CRMachineManager()
       returns
        #while self.isrunning:


if __name__ == '__main__':
    server_interface_backgndproc.parse_command_line()

Когда пришло время запустить службу, используя net start «имя службы» или панель служб в диспетчере задач, служба не запустилась. При использовании net start мы получили следующий результат:

net start 'service name'

Windows could not start the 'service name' service on Local Computer. 
The service did not return an error. 
This could be an internal Windows error or an internal service error. 
If the problem persists, contact your system administrator.

1 Ответ

0 голосов
/ 07 мая 2020

Для ясности, я отвечаю на свой вопрос, указав на особенности того, что вызвало это, и как мы его исправили, это может быть не лучший ответ, поскольку он фокусируется на конкретной причине c и не детализирует механизмы участвует в сообщении об ошибках (или нет) служб windows, или лучший метод их отладки.

Что мы обнаружили

В отличие от вывода имени службы net start ', на самом деле произошла какая-то ошибка, но об этом не было сообщено (или возвращено).

Мы решили проблему в нашем коде (и хорошее практическое правило в моей книге состоит в том, что большую часть времени плохое поведение вашего кода является вашей собственной ошибкой, а не чужой xD) с помощью старого доброго журнала инструкции, вставленные в код, чтобы показать, как далеко мы продвинулись в нашей программе до тех пор, пока не прекратилось ведение журнала. Это была настоящая проблема, мы не могли сказать, где именно в нашей кодовой базе была проблема. К счастью, это было в первых 100 строках или около того.

Вот часть кода, который мы обнаружили, что не удалось.

#Setup signal handling
signal.signal(signal.SIGTERM, self.handle_signal)

После того, как мы удалили регистрацию обработчика сигналов для SIGTERM, служба отлично работала с использованием команды net start.

Также в другом модуле мы обнаружили ту же проблему с

atexit.register(self.shutdown)

Обработчики для обеих этих ситуаций закрывают сетевые сокеты и уничтожают экземпляры модуля регистрации python. Удаление вызовов для регистрации этих обработчиков в обоих случаях устранило нашу проблему и позволило службам работать.

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

Второй вариант кажется маловероятным, поскольку эти обработчики работали в производстве годами. Первый вариант кажется правдоподобным, поскольку потенциально обработчик сигнала может заблокировать попытку остановить службу, никогда не вернувшись, возможно, MS это не нравится. Не уверен.

Таким образом, если вы пишете службу в windows и используете python, остерегайтесь использования обработки сигналов, так как это привело к сбою нашего кода без указания того, где возникла проблема и в результате во время простоя, пока мы разделили наш код пополам, чтобы найти причину проблемы.

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

...