Simple-Tracker / qBittorrent-ClientBlocker

一款适用于 qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) 的客户端屏蔽器, 默认屏蔽包括但不限于迅雷等客户端. A client blocker compatible with qBittorrent/Transmission (Beta)/BitComet (Beta, Partial) which is prohibited to include but not limited to clients such as Xunlei.
MIT License
840 stars 20 forks source link

添加Windows服务的功能 #38

Closed Yastruhank closed 4 months ago

Yastruhank commented 4 months ago

添加Windows服务的功能,使应用程序可以注册为Windows服务,在后台静默运行。

37

Simple-Tracker commented 4 months ago

GitHub Action 顺利的完成构建了, 并产生了一个 Nightly Build (https://github.com/Simple-Tracker/qBittorrent-ClientBlocker/actions/runs/8400450245), 可供测试.

configPath 和 logPath 修改的用途没太看懂, 默认情况下这个应该是同时支持相对和绝对路径的, 其相对路径是当前工作目录或程序目录 (取决于 --nochdir), 是其中有什么限制吗?

另: StopService 可以考虑改为 StopProgram, 因为这东西理论不是只有 Windows 才可用. 这 func 有点类似于"安全停止", 即需要做完当前周期. flag 里的 service-install 等等可以改为 install-service 可能会更通顺. name 和 desc 暴露给用户的话感觉意义也不大? 但也不是说不行. 默认情况下不应尝试运行为服务, 除非用户主动请求. (不确定这是否发生)

还有一问题: 服务应该在 qBittorrent 启动后才能启动, 也就是说存在一个依赖关系比较好, 不然会刷出大量的 timeout. 这在 Linux Systemd 上以 After=qbittorrent-nox.service 实现, 不过目前在 macOS LaunchAgent 上还尚未实现, 由于 macOS LaunchAgent 不支持类似操作, 因此若 Wimdows 服务也无法实现此操作, 则可考虑将此操作于程序实现 (但不是在 main_windows, 而是在如 RunConsole 的头部在 RegFlag 后通过 Flag 判断是否为服务, 这样可以兼顾其它 OS 的需求), 若为服务但依赖项未启动可尝试阻塞运行并定期判断 (一定时间未探测还可考虑退出).

Yastruhank commented 4 months ago

感谢回复。 关于configPath 和 logPath的修改,主要是因为通过Windows服务启动应用程序的工作路径不在应用程序所在路径,此时使用相对路径则是相对于Windows服务的工作路径,而一般常识会认为配置文件中的相对路径是相对于程序所在路径的,所以需要检测相对路径并将相对路径修正为相对于程序的绝对路径。 根据我的理解和测试,目前的版本在不添加输入参数时直接运行会直接从go RegHotKey()开始运行,只有以服务启动时或输入相关输入参数后才会执行对应代码。 其他的建议我会尽量尝试实现。 另外我发现该版本还有一个之前我没发现的bug,以windows服务运行的程序用户将会是system,此时获取用户appdata将会返回C:\WINDOWS\system32\config\systemprofile\AppData\,目前我在考虑在创建服务时将创建者appdata下qbittorrent配置文件路径写入config,以避免该问题。 我会在解决上述问题后重新提交,非常感谢你的建议。

Simple-Tracker commented 4 months ago

默认情况下工作路径是会切换至程序路径: https://github.com/Simple-Tracker/qBittorrent-ClientBlocker/blob/bebf86748a8d1f348f22bea319dcc58506c29109/console.go#L416-L427 因此在初始化完毕之前, 可考虑不记录日志到文件, 以避免修改 Log 记录.

不过此处的 Getwd 方法似乎有一定局限性问题, 也许是可以考虑替换成 os.Executable (参见 https://stackoverflow.com/questions/18537257/how-to-get-the-directory-of-the-currently-running-file) Done: https://github.com/Simple-Tracker/qBittorrent-ClientBlocker/commit/3591b191dfa19fec91e3418820d98f2b5ee29ce6

可试图指定服务运行用户为当前用户.

go RegHotkey 是非阻塞的异步方法.

Simple-Tracker commented 4 months ago

由于闲置一周先行关闭, 若有新提交和改动可追加后重新打开此 PR!