Estou desenhando a arquitetura de um conjunto de programas que compartilham vários objetos inter-relacionados armazenados em um banco de dados. Quero que um dos programas atue como um serviço que forneça uma interface de nível superior para operações nesses objetos, e os outros programas acessem os objetos por meio desse serviço.
Atualmente, estou visando o Python e a estrutura do Django como as tecnologias para implementar esse serviço. Tenho certeza de que sei como daemonizar o programa Python no Linux. No entanto, é um item de especificação opcional que o sistema deve oferecer suporte ao Windows. Tenho pouca experiência com a programação do Windows e nenhuma experiência com os serviços do Windows.
É possível executar um programa Python como um serviço do Windows (ou seja, executá-lo automaticamente sem o login do usuário)? Não precisarei necessariamente implementar esta parte, mas preciso de uma idéia aproximada de como isso seria feito para decidir se o projeto deve seguir essas linhas.
Edit: Obrigado por todas as respostas até agora, eles são bastante abrangentes. Gostaria de saber mais uma coisa: como o Windows está ciente do meu serviço? Posso gerenciá-lo com os utilitários nativos do Windows? Qual é o equivalente a colocar um script de início / parada no /etc/init.d?
fonte
Respostas:
Sim você pode. Faço isso usando as bibliotecas pythoncom incluídas no ActivePython ou podem ser instaladas com o pywin32 (extensões do Python para Windows).
Este é um esqueleto básico para um serviço simples:
Seu código seguiria o
main()
método - geralmente com algum tipo de loop infinito que pode ser interrompido pela verificação de um sinalizador, que você define noSvcStop
métodofonte
socket.setdefaulttimeout(60)
é? É necessário para um serviço ou foi apenas acidentalmente copiado de algum serviço existente? :)Embora eu tenha votado positivamente na resposta escolhida há algumas semanas, nesse meio tempo, lutei muito mais com esse tópico. Parece que ter uma instalação especial do Python e usar módulos especiais para executar um script como serviço é simplesmente o caminho errado. E a portabilidade e tal?
Encontrei o maravilhoso Gerenciador de serviços não sugadores , o que tornava realmente simples e sensato lidar com os Serviços do Windows. Imaginei que, como eu poderia passar opções para um serviço instalado, também poderia selecionar meu executável Python e passar meu script como uma opção.
Ainda não tentei esta solução, mas vou fazê-lo agora e atualizar esta postagem ao longo do processo. Também estou interessado em usar virtualenvs no Windows, para que eu possa criar um tutorial mais cedo ou mais tarde e vincular aqui.
fonte
new-service
no PowerShell deveria ser capaz de fazer isso, mas iniciar (e monitorar) um script como serviço evidentemente envolve muito mais detalhes, dos quais o nssm cuida muito bem.A maneira mais simples é usar o: NSSM - o Non-Sucking Service Manager:
1 - faça o download em https://nssm.cc/download
2 - instale o programa python como um serviço: Win prompt as admin
c:> nssm.exe instala o WinService
3 - No console do NSSM:
caminho: C: \ Python27 \ Python27.exe
Diretório de inicialização: C: \ Python27
Argumentos: c: \ WinService.py
4 - verifique os serviços criados em services.msc
fonte
A maneira mais simples de conseguir isso é usar o comando nativo sc.exe:
Referências:
fonte
Existem algumas alternativas para instalar como serviço praticamente qualquer executável do Windows.
Método 1: usar instsrv e srvany do rktools.exe
Para o Windows Home Server ou o Windows Server 2003 (também funciona com o WinXP), o Windows Server 2003 Resource Kit Tools vem com utilitários que podem ser usados em conjunto para isso, chamados instsrv.exe e srvany.exe . Consulte este artigo da KB KB787890 da Microsoft para obter detalhes sobre como usar esses utilitários.
Para o Windows Home Server, existe um ótimo invólucro fácil de usar para esses utilitários chamado apropriadamente " Any Service Installer ".
Método 2: Use ServiceInstaller para Windows NT
Há outra alternativa usando o ServiceInstaller para Windows NT (disponível para download aqui ) com instruções em python disponíveis . Ao contrário do nome, ele funciona tanto com o Windows 2000 quanto com o Windows XP. Aqui estão algumas instruções sobre como instalar um script python como um serviço.
Após minha resposta inicial, notei que havia perguntas e respostas estreitamente relacionadas já publicadas no SO. Veja também:
Posso executar um script Python como um serviço (no Windows)? Quão?
Como conscientizo o Windows sobre um serviço que escrevi em Python?
fonte
NT
seria necessariamente "contrário" ao nome, pelo menos não no discurso popular entre programadores. Apenas se refere à " arquitetura NT ", em oposição à " marca NT ". Dito isto, de acordo com a conversa na wikipedia, isso está em debate, uma vez que "não é um termo oficial da Microsoft", mas ainda assim há uma tradição nessa linha de pensamento.Explicação passo a passo de como fazê-lo funcionar:
1- Primeiro crie um arquivo python de acordo com o esqueleto básico mencionado acima. E salve-o em um caminho, por exemplo: "c: \ PythonFiles \ AppServerSvc.py"
2 - Nesta etapa, devemos registrar nosso serviço.
Execute o prompt de comando como administrador e digite como:
o primeiro argumento do binpath é o caminho do python.exe
O segundo argumento do binpath é o caminho do seu arquivo python que criamos já
Não perca que você deve colocar um espaço após cada sinal " = ".
Então, se está tudo bem, você deve ver
Agora seu serviço python está instalado como serviço do Windows agora. Você pode vê-lo no Service Manager e no registro em:
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ TestService
3- Ok agora. Você pode iniciar seu serviço no gerenciador de serviços.
Você pode executar todos os arquivos python que fornecem esse esqueleto de serviço.
fonte
SetEvent(self.hWaitStop)
eWaitForSingleObject
. Provavelmente, com base na cópia impensada da resposta selecionada aqui. Essa é uma boa maneira de fazer isso que funcione corretamente para os argumentos "debug" e "stop". (A parte sobre o uso do SC parece redundante quandoHandleCommandLine
faz o trabalho e pode executar a depuração.)pysc: Service Control Manager em Python
Exemplo de script a ser executado como um serviço obtido em pythonhosted.org :
fonte
Comecei a hospedagem como um serviço com pywin32 .
Tudo estava bem, mas eu encontrei o problema de que o serviço não era capaz de iniciar dentro de 30 segundos (tempo limite padrão para Windows) na inicialização do sistema. Isso foi fundamental para mim, porque a inicialização do Windows ocorreu simultaneamente em várias máquinas virtuais hospedadas em uma máquina física e a carga de IO foi enorme. As mensagens de erro foram:
Error 1053: The service did not respond to the start or control request in a timely fashion.
Error 7009: Timeout (30000 milliseconds) waiting for the <ServiceName> service to connect.
Eu lutei muito com o pywin, mas acabei usando o NSSM, como foi proposto nesta resposta . Foi muito fácil migrar para ele.
fonte
nssm em python 3+
(Eu converti meu arquivo .py para .exe com pyinstaller )
nssm: como dito antes
No console do NSSM:
caminho: caminho \ para \ seu \ programa.exe
Diretório de inicialização: path \ to \ your \ #same como o caminho, mas sem o seu program.exe
Argumentos: vazio
Se você não deseja converter seu projeto para .exe
python {{your python.py file name}}
fonte
Um exemplo completo do pywin32 usando loop ou subthread
Depois de trabalhar nisso por alguns dias, aqui está a resposta que eu gostaria de encontrar, usando o pywin32 para mantê-lo agradável e independente.
Esse é um código de trabalho completo para uma solução baseada em loop e outra baseada em encadeamento. Pode funcionar em python 2 e 3, embora eu só tenha testado a versão mais recente no 2.7 e no Win7. O loop deve ser bom para pesquisar código e a banda de rodagem deve funcionar com mais código semelhante ao servidor. Parece funcionar bem com o servidor wsgi da garçonete que não possui uma maneira padrão de desligar normalmente.
Também gostaria de observar que parece haver muitos exemplos por aí, como este, que são quase úteis, mas na realidade enganosos, porque eles cortaram e colaram outros exemplos cegamente. Eu poderia estar errado. mas por que criar um evento se você nunca o espera?
Dito isto, ainda sinto que estou em um terreno um pouco instável aqui, especialmente no que diz respeito à limpeza da saída da versão do encadeamento, mas pelo menos acredito que não há nada enganoso aqui.
Para executar, copie o código para um arquivo e siga as instruções.
atualizar:
Use um sinalizador simples para finalizar o encadeamento. O ponto importante é que o "thread done" é impresso.
Para um exemplo mais elaborado saindo de um encadeamento de servidor não cooperativo, veja minha postagem sobre o servidor wsgi de garçonete .
fonte
A resposta aceita usando
win32serviceutil
funciona, mas é complicada e dificulta a depuração e as alterações. É muito mais fácil usar o NSSM ( o Non-Sucking Service Manager) . Você escreve e depura confortavelmente um programa python normal e, quando ele finalmente funciona, você usa o NSSM para instalá-lo como um serviço em menos de um minuto:Em um prompt de comando elevado (admin), você executa
nssm.exe install NameOfYourService
e preenche estas opções:C:\Python27\Python.exe
)c:\path\to\program.py
)A propósito, se o seu programa imprimir mensagens úteis que você deseja manter em um arquivo de log, o NSSM também poderá lidar com isso e muito mais para você.
fonte
Para quem deseja criar serviço em VENV ou Pycharm !!!!!!!
Depois de ler todas as respostas e criar alguns scripts, se você puder executar
python service.py install
epython service.py debug
, maspython service.py start
não tiver resposta.Talvez seja causado por um problema venv, porque o serviço windows inicia seu serviço pelo exec
PROJECT\venv\Lib\site-packages\win32\pythonservice.exe
.Você pode usar
powershell
oucmd
testar seu serviço para encontrar mais detalhes dos erros.Se você receber algum erro como eu, poderá verificar minha resposta em outra pergunta, corrigi-a e postei meu código aqui .
fonte
https://www.chrisumbel.com/article/windows_services_in_python
Acompanhe o PySvc.py
alterando a pasta dll
Eu sei que isso é velho, mas eu fiquei preso nisso para sempre. Para mim, esse problema específico foi resolvido copiando este arquivo - pywintypes36.dll
De -> Python36 \ Lib \ pacotes de sites \ pywin32_system32
Para -> Python36 \ Lib \ pacotes de sites \ win32
cd C:\Users\user\AppData\Local\Programs\Python\Python38-32
NET START PySvc
NET STOP PySvc
fonte