【问题标题】:Python pywin32/nssm can't start servicePython pywin32/nssm 无法启动服务
【发布时间】:2018-11-06 13:21:24
【问题描述】:

我的脚本/程序由 main.py 组成; submethod1.py, submethod2.py 在子目录中;临时文件的第二个子目录;一个用于记录的 txt 文件 我正在努力将它作为服务运行一周。

PyWin32 给了我Error 1053: The service did not respond to the start or control request in a timely fashion。 NSSM 只写了这个Unexpected status SERVICE_STOPPED in response to START control 而在标准输出中什么都没有 如何理解服务有什么问题?我无法正确调试它。 它可以完美地独立运行,我在 IDE 中对其进行了调试。

import configparser

from script.sql import *


def app():
    # reading .ini file
    print (os.getcwd())
    default_file = os.getcwd()+ r"/config.ini"
    config = configparser.ConfigParser()
    config.read (default_file)
    path = config.get ("XLS", "dir")
    file_1 = path + "\\" + config.get ("XLS", "workbook1")
    file_2 = path + "\\" + config.get ("XLS", "workbook2")
    file_3 = path + "\\" + config.get ("XLS", "workbook3")
    usr = config.get ("SQL", "user")
    pwd = config.get ("SQL", "password")
    hst = config.get ("SQL", "host")
    db = config.get ("SQL", "database")
    pt = config.get ("SQL", "port")
    ssl_cert = config.get ("SQL", "ssl_cert")
    ssl_ca = config.get ("SQL", "ssl_ca")
    ssl_key = config.get ("SQL", "ssl_key")
    enc = config.get ("SQL", "encoding")
    sql_config = "mysql+pymysql://" + usr + ":" + pwd + "@" + hst + ":" + pt + "/" + db + "?" + ssl_cert + "&" + \
                 ssl_ca + "&" + ssl_key + "&" + enc

    if (os.path.isfile (file_1) == True or os.path.isfile (file_2) == True or os.path.isfile (file_3) == True):

        SQL.sqlconnect (sql_config)

        if (os.path.isfile (file_1) == True):

            XLS.xls_wrk (file_1)
            df_xls_1 = XLS.table_xls (file_1)
            df_sql_1 = SQL.table_sql (file_1, sql_config)

            if (df_sql_1.equals (df_xls_1) == False):
                try:
                    SQL.sql_import (file_1, sql_config)
                except:
                    SQL.table_trunc (file_1, sql_config)

        if (os.path.isfile (file_2) == True):
            XLS.xls_wrk (file_2)
            df_xls_2 = XLS.table_xls (file_2)
            df_sql_2 = SQL.table_sql (file_2, sql_config)

            if (df_sql_2.equals (df_xls_2) == False):
                try:
                    SQL.sql_import (file_2, sql_config)
                except:
                    SQL.table_trunc (file_2, sql_config)

        if (os.path.isfile (file_3) == True):
            XLS.xls_wrk (file_3)
            df_xls_3 = XLS.table_xls (file_3)
            df_sql_3 = SQL.table_sql (file_3, sql_config)

            if (df_sql_3.equals (df_xls_3) == False):
                try:
                    SQL.sql_import (file_3, sql_config)
                except:
                    SQL.table_trunc (file_3, sql_config)

        SQL.con_close (sql_config)

    else:
        with open (os.getcwd () + r"\PyXLSQL.log", "a+") as text_file:
            print (f"{str(datetime.datetime.now()).split('.')[0]} - Excel workbooks not found in dir {path}",
                   file=text_file)
if __name__ == '__main__':
    app()

我使用了像all python windows service can not start{error 1053}这样的工作模板

有什么问题吗?有一个循环,或者我可以添加一个循环来检查 RunSvc 部分中任何 *xls 文件的目录。无论如何,在尝试将其作为服务运行后没有有用的调试信息。

更新:

Debugging service PyTest - press Ctrl+C to stop.
Info 0x40001002 - The PyTest service has started.
Error 0xC0000003 - The instance's SvcRun() method failed

<Error getting traceback - traceback.print_exception() failed

(null): (null)

使用另一个模板作为服务运行脚本。

【问题讨论】:

    标签: python service pywin32 nssm


    【解决方案1】:

    我在 NSSM 上遇到过非常相似的问题。确保您对文件路径使用直接路径。

    此行将适用于 NSSM:

    f_name = '//Bm-app1/bmcapps/logs/Hourly_Scripts.log'

    这一行在 NSSM 中不起作用,但会在 py 文件中:

    f_name = 'W:\logs\Hourly_Scripts.log'

    第一行是我的文件所在的另一台服务器的直接路径。第二行是同一个文件的路径,但使用了我的映射驱动器。 使用第二行时,NSSM 会抛出错误并且不启动进程。在另一个实例中,我看到它终止了我的预定循环,并且错误将更多地充当通过并直接移动到下一个实例。

    【讨论】:

    • 我知道nssm。我的解决方案是不同的。我已更改代码并将其编译为带有Pyinstaller 的.exe。关于这种解决方案的答案很少。在我看来,如果你将它作为独立应用程序分发它是最好的解决方案,否则你必须在用户的机器上安装 Python 或nssm
    【解决方案2】:

    我在 NSSM 上遇到了类似的问题,在我的情况下,问题是由于我没有正确设置工作目录。

    使用以下命令从 python 脚本创建服务时:nssm install '&lt;SERVICE_NAME&gt;' '&lt;PYTHON_INTERPRETER_PATH&gt;' '&lt;SCRIPT_PATH&gt;' 工作目录设置为包含 python 可执行文件的目录。

    为了解决这个问题,我必须使用命令 nssm set &lt;SERVICE_NAME&gt; AppDirectory &lt;SCRIPT_DIRECTORY&gt; 或使用 Edit-GUI nssm edit &lt;SERVICE_NAME&gt; 将路径更改为包含我想要运行的脚本的路径

    【讨论】:

      猜你喜欢
      • 2023-03-14
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多