一、准备工作

1.1 环境要求

  • Windows操作系统(Win7/10/11/Server均可)

  • Python 3.x 已安装

  • 管理员权限(安装服务需要)

1.2 安装必要的Python库

pip install pywin32

二、编写服务代码

2.1 完整代码

创建一个新的Python文件,比如 log_service.py,代码如下:

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Windows 服务版本的定时写日志程序
功能:无需批处理、无需黑窗口,开机自动后台运行,每隔3分钟向 C:\log.txt 写入系统时间
"""

import win32serviceutil
import win32service
import win32event
import servicemanager
import sys
import time
from datetime import datetime


class LogService(win32serviceutil.ServiceFramework):
    """定时日志写入服务类"""
    # 服务名称(命令行中使用)
    _svc_name_ = "shao_log"
    # 服务显示名称(服务管理器中显示)
    _svc_display_name_ = "定时日志写入服务"
    # 服务描述
    _svc_description_ = "每3分钟向C:\\log.txt写入系统时间"

    def __init__(self, args):
        """初始化服务"""
        win32serviceutil.ServiceFramework.__init__(self, args)
        # 创建停止事件
        self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
        # 服务运行状态
        self.running = True
        # 写入间隔(秒)- 3分钟 = 180秒
        self.interval = 180
        # 日志文件路径
        self.log_file = r"C:\log.txt"

    def SvcStop(self):
        """服务停止方法"""
        self.running = False
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.hWaitStop)

    def SvcDoRun(self):
        """服务运行方法"""
        # 记录服务启动日志到系统事件查看器
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            0,  # 事件ID
            (self._svc_name_, '服务已启动')
        )
        # 执行主逻辑
        self.main()

    def write_log(self):
        """写入日志到C盘"""
        try:
            # 获取当前时间
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            
            # 尝试写入C盘
            with open(self.log_file, "a", encoding="utf-8") as f:
                f.write(f"{current_time} - 服务运行中\n")
                
        except Exception as e:
            # 写入失败时,记录到系统事件日志
            error_msg = f"C盘写入失败: {e}"
            servicemanager.LogErrorMsg(error_msg)

    def main(self):
        """主循环逻辑"""
        # 立即写入一次日志
        self.write_log()
        
        # 循环执行,直到服务停止
        while self.running:
            # 等待停止事件或超时
            ret = win32event.WaitForSingleObject(self.hWaitStop, self.interval * 1000)
            if ret == win32event.WAIT_OBJECT_0:
                # 收到停止信号,退出循环
                break
            # 写入日志
            self.write_log()


if __name__ == "__main__":
    """服务入口"""
    if len(sys.argv) == 1:
        # 直接运行时,启动服务控制分发器
        servicemanager.Initialize()
        servicemanager.PrepareToHostSingle(LogService)
        servicemanager.StartServiceCtrlDispatcher()
    else:
        # 带命令行参数时,处理服务命令(install/start/stop/remove等)
        win32serviceutil.HandleCommandLine(LogService)

2.2 代码说明

部分说明
_svc_name_服务名称,用于命令行操作
_svc_display_name_服务显示名称,在服务管理器中看到的名字
interval = 180写入间隔,单位秒(180秒=3分钟)
log_file日志文件路径,这里是C盘根目录的log.txt
SvcStop()服务停止时自动调用
SvcDoRun()服务启动时自动调用

三、安装和运行服务

3.1 以管理员身份打开命令提示符

  • 按 Win + X,选择"Windows PowerShell(管理员)"或"命令提示符(管理员)"

  • 或者搜索cmd,右键选择"以管理员身份运行"

3.2 安装服务

# 进入代码所在目录
cd C:\path\to\your\script

# 安装服务
python log_service.py install

3.3 启动服务

python log_service.py start

3.4 查看服务状态

python log_service.py status

3.5 停止服务

python log_service.py stop

3.6 卸载服务

python log_service.py remove

四、验证服务是否正常运行

4.1 检查日志文件

等待3分钟,检查C盘根目录下是否生成了 log.txt 文件,内容类似:

2024-01-15 10:30:00 - 服务运行中 2024-01-15 10:33:00 - 服务运行中 2024-01-15 10:36:00 - 服务运行中

4.2 服务管理器中查看

  1. 按 Win + R,输入 services.msc 回车

  2. 在服务列表中找到"定时日志写入服务"

  3. 查看状态是否为"正在运行"

4.3 系统事件查看器中查看

  1. 按 Win + X,选择"事件查看器"

  2. 导航到:Windows日志 → 系统

  3. 筛选来源为"shao_log"的事件

五、常见问题解决

5.1 安装失败:"拒绝访问"

  • 原因:没有以管理员身份运行

  • 解决:右键命令提示符,选择"以管理员身份运行"

5.2 服务启动后立即停止

  • 原因:代码有语法错误或权限问题

  • 解决:检查C盘是否有写入权限,查看系统事件日志获取错误信息

5.3 C盘无法写入日志

  • 原因:Windows限制了普通程序写入C盘根目录

  • 解决方案

    • elf.log_file = r"C:\ProgramData\log.txt"
      # 或
      self.log_file = r"D:\log.txt"

5.4 服务名称已存在

# 先卸载现有服务 python log_service.py remove # 重新安装 python log_service.py install

六、常用命令一览表

命令说明
python log_service.py install安装服务
python log_service.py remove卸载服务
python log_service.py start启动服务
python log_service.py stop停止服务
python log_service.py restart重启服务
python log_service.py status查看服务状态
python log_service.py debug调试模式运行(前台显示)

七、进阶:修改配置

如果想修改写入间隔或日志路径,只需修改代码中的两个地方:

# 修改写入间隔为5分钟 self.interval = 300 # 修改日志路径为D盘 self.log_file = r"D:\mylog.txt"

修改后需要重新安装服务才能生效:

python log_service.py remove
python log_service.py install
python log_service.py start

八、总结

通过本教程,你学会了:

  1. ✅ 使用Python创建Windows服务

  2. ✅ 安装、启动、停止、卸载服务

  3. ✅ 服务开机自启动

  4. ✅ 定时执行任务的实现

  5. ✅ 日志写入和错误处理

现在你的服务已经可以开机自动运行,无需任何人工干预了!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐