Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加Windows服务的功能 #38

Closed
wants to merge 2 commits into from

Conversation

Yastruhank
Copy link

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

@Simple-Tracker
Copy link
Owner

Simple-Tracker commented Mar 23, 2024

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 的需求), 若为服务但依赖项未启动可尝试阻塞运行并定期判断 (一定时间未探测还可考虑退出).

@Simple-Tracker Simple-Tracker force-pushed the master branch 2 times, most recently from a20dc76 to 2c0b8dd Compare March 24, 2024 06:35
@Yastruhank
Copy link
Author

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

@Simple-Tracker
Copy link
Owner

Simple-Tracker commented Mar 25, 2024

默认情况下工作路径是会切换至程序路径:

if !noChdir {
dir, err := os.Getwd()
if err == nil {
if os.Chdir(dir) == nil {
Log("RunConsole", "切换工作目录: %s", false, dir)
} else {
Log("RunConsole", "切换工作目录失败: %s", false, dir)
}
} else {
Log("RunConsole", "切换工作目录失败, 将以当前工作目录运行: %s", false, err.Error())
}
}

因此在初始化完毕之前, 可考虑不记录日志到文件, 以避免修改 Log 记录.

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

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

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

@Simple-Tracker Simple-Tracker force-pushed the master branch 23 times, most recently from bbf95b7 to f710600 Compare March 27, 2024 08:05
@Simple-Tracker Simple-Tracker force-pushed the master branch 22 times, most recently from e3131c7 to f362823 Compare March 28, 2024 09:31
@Simple-Tracker
Copy link
Owner

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants