web-dev-qa-db-ja.com

Python Windowsサービス "サービスの開始エラー:サービスは開始または制御要求にタイムリーに応答しませんでした"

以下のコードを、通常のコマンドプロンプトからpython win_service.py installで実行しています。アクセス拒否エラーが表示されます。

サービスTestServiceのインストール

サービスのインストールエラー:アクセスが拒否されました。(5)

管理者として起動してコマンドプロンプトを起動したときに解決できました。

サービスをインストールできましたが、サービスを開始できませんでした。

インストールされているサービス

開始サービスTestService

サービスの開始エラー:サービスは開始または制御要求にタイムリーに応答しませんでした。

import win32serviceutil
import win32service
import win32event
import servicemanager
import socket

class AppServerSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "TestService"
    _svc_display_name_ = "Test Service"

    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.hWaitStop = win32event.CreateEvent(None,0,0,None)
        socket.setdefaulttimeout(60)

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE,
                              servicemanager.PYS_SERVICE_STARTED,
                              (self._svc_name_,''))
        self.main()

    def main(self):
        print "running"

if __name__ == '__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc)

問題は何ですか?問題を解決するサービスをインストールする他の方法と、管理者として動的に実行する方法はありますか?.

25

私はこれが古いことを知っていますが、私はこれに永遠に行き詰まりました。私にとって、この特定の問題はこのファイルをコピーすることで解決されました-pywintypes36.dll

から-> Python36\Lib\site-packages\pywin32_system32

宛先-> Python36\Lib\site-packages\win32

これに関する素晴らしい記事があります-> https://www.thepythoncorner.com/2018/08/how-to-create-a-windows-service-in-python

18
Chip

実行可能ファイルが見つからないため、サービスが開始されていない可能性があります。私のシステムパスにいくつかのpywin32関連ディレクトリを追加することで解決した同様の問題がありました。これは、setxを使用して行うことができます。

setx /M PATH "%PATH%;C:\Python27;C:\Python27\Scripts;C:\Python27\Lib\site-packages\pywin32_system32;C:\Python27\Lib\site-packages\win32"

これを管理者権限でcmdウィンドウで実行してみて、自分のpythonインストールに一致するようにパスを調整してください。

9
dslosky

チップ(およびこれを理解しようとしたときに見逃していた)が指摘しているように、pythonservice.exeはsystemサービスとして実行されるため、ユーザーとして実行する場合とは異なる環境になります。 python service.py debugの実行は、ユーザー環境で実行されているため問題なく実行されますが、python service.py startを実行すると、環境変数の違いにより、代わりに失敗する可能性があります。インスタントタイムアウトの原因として最も可能性が高いのは、pythonservice.exeの実行の失敗であり、それはwillの実行に失敗し、PythonXX.dllまたはpywintypesXX.dllのいずれかが欠落しています。

PythonXX.dllはすでにシステムパスにある可能性があります(Pythonのインストール方法によって異なります)。ただし、私のようで、環境を変更しないように細心の注意を払っている場合は、私は.\.pyenv37\Scripts\python.exe service.py startのようなものを実行していて、想定したvenvではなくPATHからPython37.dllを取得するため、pythonservice.exeが別のPATHを使用して実行を開始すると、Windowsレポートにすぐに失敗します。インスタントタイムアウトとして。

同じことがpywintypesXX.dllにも当てはまりますが、検索パスのどこかにインストールする代わりに、よりポータブルな解決策は、それをpythonservice.exeと同じディレクトリにドロップすることです デフォルトDLL検索パスを含む 。また、pythonservice.exeが見つからない場合、サービスはすぐにタイムアウトします。

ログを一切使わずにこれを把握することは、絶対的な悪夢です。


編集:これは私がスクリプトのインストール/更新でそれをすべて確認するために使用しているものです:

# customOptionHandler will only run after service install/update
if __name__=='__main__':
    win32serviceutil.HandleCommandLine(AppServerSvc, customOptionHandler=post_service_update)

def post_service_update(*args):
    import win32api, win32con, win32profile, pywintypes
    from contextlib import closing

    env_reg_key = "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"
    hkey = win32api.RegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, env_reg_key, 0, win32con.KEY_ALL_ACCESS)

    with closing(hkey):
        system_path = win32api.RegQueryValueEx(hkey, 'PATH')[0]
        # PATH may contain %SYSTEM_ROOT% or other env variables that must be expanded
        # ExpandEnvironmentStringsForUser(None) only expands System variables
        system_path = win32profile.ExpandEnvironmentStringsForUser(None, system_path)
        system_path_list = system_path.split(os.pathsep)

        core_dll_file = win32api.GetModuleFileName(sys.dllhandle)
        core_dll_name = os.path.basename(core_dll_file)

        for search_path_dir in system_path_list:
            try:
                dll_path = win32api.SearchPath(search_path_dir, core_dll_name)[0]
                print(f"System python DLL: {dll_path}")
                break
            except pywintypes.error as ex:
                if ex.args[1] != 'SearchPath': raise
                continue
        else:
            print("*** WARNING ***")
            print(f"Your current Python DLL ({core_dll_name}) is not in your SYSTEM PATH")
            print("The service is likely to not launch correctly.")

    from win32serviceutil import LocatePythonServiceExe
    pythonservice_exe = LocatePythonServiceExe()
    pywintypes_dll_file = pywintypes.__spec__.Origin

    pythonservice_path = os.path.dirname(pythonservice_exe)
    pywintypes_dll_name = os.path.basename(pywintypes_dll_file)

    try:
        return win32api.SearchPath(pythonservice_path, pywintypes_dll_name)[0]
    except pywintypes.error as ex:
        if ex.args[1] != 'SearchPath': raise
        print("*** WARNING ***")
        print(f"{pywintypes_dll_name} is not is the same directory as pythonservice.exe")
        print(f'Copy "{pywintypes_dll_file}" to "{pythonservice_path}"')
        print("The service is likely to not launch correctly.")

多くのように思えるかもしれませんが、新しいマシン/仮想環境にサービスをデプロイするとき、またはpythonを更新するときに、少なくともこれらの手順を忘れないようにします。

3
VLRoyrenn

anaconda pythonを使用している場合は、python36.dllがシステムパスにあることを確認してください。これを見つけるのに長い時間がかかりました。

クレジット: Python(win32serviceutil))で記述されたWindowsサービスを開始できません

1
echo

デバッグを開始する前に、 https://github.com/mhammond/pywin32 で説明されている2つのステップを確認することをお勧めします。

pip install pywin32

そして

python Scripts/pywin32_postinstall.py -install

完成しました。

0
Phantom

以下のパスがシステム変数パスに追加されていることを確認してください。以下のパスがPython 3.7に追加されています。インストールされているバージョンpythonに従ってパスを追加してください。

C:\ Users\1022226\AppData\Local\Programs\Python\Python37\Scripts C:\ Users\1022226\AppData\Local\Programs\Python\Python37

0
Abhishek Gupta

デフォルトのローカルシステムユーザーとは異なるユーザーでアプリケーションを実行していることを確認してください。デバッグコマンドを正常に実行できるユーザーに置き換えます。

  • ユーザーを置き換えるには、Windowsサービスに移動します([スタート]> [services.msc])。
  • 作成したサービスを右クリック>プロパティ>ログオン
  • ローカルシステムアカウントのチェックを外し、自分のアカウントを入力します。

from all python windows service can not start {error 1053} 私のために働きました。

システムではなく、ユーザーのログイン用にPATHを設定するだけだからです。システム変数のPATHを再確認できます。

0
haulpd