Golang Go语言中无法监听到程序通过任务管理器"结束任务"的退出事件
Golang Go语言中无法监听到程序通过任务管理器"结束任务"的退出事件
windows 下 通过任务管理器,选择"结束任务",关闭程序。golang 有没有什么办法监听到关闭事件。os.Signal 对由任务管理器关闭无效。
window 任务管理器这个以前查过, golang 层好像的确监听不到.
更多关于Golang Go语言中无法监听到程序通过任务管理器"结束任务"的退出事件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
但是 windows 下的 IDE 的 run & stop 是支持的 os.Signal 的
所以要实现监听可以试试用命令行的 taskkill
Windows 没有 Unix 的 signal 机制,所以实现不了的。
CLI: 用 SetConsoleCtrlHandler 处理 CTRL_CLOSE_EVENT
GUI: 在 WdProc 里处理 WM_CLOSE
go,not golang
.Net 可以用 WaitForExit 达到监听的目的 前提是进程是你的进程打开的
程序启动时顺带启动一个 cmd 脚本,脚本里面循环检测进程是否存在,如果不存在就执行 xxx
tasklist 抓一下
看了楼上回答的,没有一个满意的。监听进程如果你创建的,你可以 wait ,不是你创建的,你要打开进程句柄 wait, 是不是很烦。 所以进程管理的 queryprocessinfo 这个 API,你也可以用,这样就解决了。
任何程序都可以通过系统 API 监听进程运行状态,但都不能监听到自身的异常退出。因为在此之前,你就异常退出了呀。所以,自己另外起一个守护进程监听就好了嘛。
python 可以监听,go 不清楚。
主进程用 golang 写的。调用 winform 开发的 gui 程序。在任务管理器里面关闭 golang 程序的话,winform 程序还是在跑着。如果关闭 winform 程序,golang 能监听到,程序能正常退出
通过这种方式关闭进程和在 Linux 下用 kill -9 一样,根本不给进程任何机会就杀死了,所以不可能做出响应。
确实,kill 和 stop 无法捕捉。。内核源码改起来哈哈哈 重新编译内核 然后全盘崩掉(逃)
在Go语言中,确实存在一些挑战来捕获通过任务管理器(如Windows的任务管理器)强制结束进程的事件。标准的信号处理机制,如使用os/signal
包来监听中断信号(如SIGINT、SIGTERM),通常无法覆盖所有进程终止情况,特别是通过任务管理器“结束任务”这样的强制终止操作。
这是因为当进程被任务管理器强制终止时,操作系统不会给进程发送任何正常的终止信号,而是直接终止其运行。因此,Go程序无法预先捕获到这样的终止事件来执行清理操作或保存状态。
为了应对这种情况,你可以采取以下几种策略:
-
定期保存状态:设计你的程序定期将关键状态保存到持久化存储中,比如数据库或文件。这样即使进程被强制终止,你也能恢复到最后一次保存的状态。
-
监控与重启:使用外部监控工具或服务来监控你的Go程序。如果检测到程序意外终止,监控工具可以自动重启它。
-
用户教育:如果可能,引导用户避免使用任务管理器来结束你的程序,而是提供程序内部的退出机制,如一个明确的退出按钮或命令。
虽然无法直接捕获通过任务管理器结束的事件,但通过合理的架构设计和部署策略,你可以最小化这种意外终止带来的负面影响。