吐槽一下 windows 的终端的一个天坑

2023-12-04 14:03:20 +08:00
 vituralfuture

一个 django 开发的后端,因为是学校里的学长组织的项目,所以给了一个他们实验室里的一台 windows 作为服务器,平时远程上去用。最近有一个接口account/check经常卡死,具体情况就是

其他接口都正常

我上服务器上排查了一下,发现了一个天坑 cmd 窗口在选中模式下,account/check会卡死,其他接口正常但是终端没有输出( django 处于调试或者开发模式,每请求一次都打印在终端)

去网上查了一下,找到了这个 https://stackoverflow.com/questions/33883530/why-is-my-command-prompt-freezing-on-windows-10

虽然不知道为什么只有account/check会出现这个问题,不过可以确定这个选择模式真是一个大聪明

网上找到的解决方案是:关闭 Quick Edit Mode

但我觉得这还是不太方便。如果这种大聪明功能一多,岂不是拿到一台新的 windows 机器还要设置一堆东西?我觉得可能是使用终端的方式错了,v 友们有没有遇到这个问题?都是怎么解决的?

6471 次点击
所在节点    Windows
48 条回复
Worldispow
2023-12-04 14:08:39 +08:00
你程序咋启动的,没跑在后台吗?
即便是 linux ,程序也要跑到后台啊。。。
vituralfuture
2023-12-04 14:15:01 +08:00
补充一下,上面的链接的内容就是,当 cmd 窗口处于选中模式下时,进程会被 halt (原文是这个词,我猜是阻塞的意思),直到进程尝试往终端打印。
我测试出的情况就是,当窗口处于选择模式下,终端没有任何的输出。然后随便点击一下窗口,退出选择模式,终端 会一口气输出之前被卡住的所有信息。
我在项目里是负责前端的,给后端同学反映这个问题,他并没有发现问题的原因,只是点击了一下窗口发现莫名其妙好了,然后 django 输出了一个错误`Broken Pipe`,然后他以为是这个原因。很显然这不是根本原因,因为浏览器超时自动断开了连接,然而这个接口恢复执行后拿到了一个另一方已经断开连接的管道,自然就会出现`Broken Pipe`
vituralfuture
2023-12-04 14:19:07 +08:00
@Worldispow 负责后端的同学打开了一个 cmd 窗口,然后执行`python manage.py runserver 0.0.0.0:8080`

我对 windows 也不太了解,不过刚刚看后端的同学似乎在尝试用 windows 的 IIS 。

如果我用 linux 的话,我应该是`nohup python xxxx &`
cwcc
2023-12-04 14:20:13 +08:00
这个问题应该是 conhost 本身的默认配置导致的。因为有时候确实会不小心点一下窗口内,然后出现个白色的光标,程序就被卡住了。最简单的办法就是不用 conhost 作为持久化程序运行的本体,使用 WT 或者别的守护方式,服务什么的也行。
vituralfuture
2023-12-04 14:20:33 +08:00
@vituralfuture #3 本科生参加的很多项目基本都是灌水,菜,见谅
maggch97
2023-12-04 14:32:18 +08:00
遇到不能理解的问题先想想为什么会这样设计,而不是在什么都不会的时候这也吐槽那也吐槽。
Hellert
2023-12-04 14:35:05 +08:00
这种控制台的最好是用 WinSW 把所有开机启动的程序安装为服务,它同时会将控制台输出保存为文件,方便你查看。

我印象中 conhost 还有一个问题,就是如果你按住鼠标拖动控制台窗口,你的程序也会暂停运行。具体我记不清了,现在现在基本用 Windows Terminal 了。
zenghx
2023-12-04 14:56:02 +08:00
这不是 cmd 祖传的设定吗
flyqie
2023-12-04 14:58:54 +08:00
@zenghx #8

确实。。。很祖传了
kenvix
2023-12-04 15:01:06 +08:00
这怎么就天坑了?控制台程序进入选择模式时,控制台输出流阻塞以便于你选取,这是预期行为。你应该思考下为什么你打个 log 都能把整个程序阻塞住?
ShadowPower
2023-12-04 15:06:05 +08:00
Windows 曾经还有另一个天坑,Windows XP 有,和这个相似。
如果拖动窗口或者右键单击窗口标题栏,弹出菜单,整个窗口都会被暂停。

这玩意可以用来卡游戏 bug……
8153
2023-12-04 15:09:01 +08:00
祖传特性,不要惊讶。cmd 开的东西,不要选中,不然可能阻塞了
8153
2023-12-04 15:09:39 +08:00
这个时候一直按照 enter 就行了
wetalk
2023-12-04 15:12:44 +08:00
祖传特性,cmd 下启动 run 脚本一直是这样
kenvix
2023-12-04 15:21:40 +08:00
@vituralfuture 那你直接跟后端骂他写的什么垃圾东西,打 log 能卡住 web 服务,正常人干不出来这事。今天能因为 conhost 阻塞导致整个程序卡死,明天就能因为 log 打太快导致业务缓慢
murmur
2023-12-04 15:24:04 +08:00
选择的时候标题会变

选择:命令提示符

到底是天坑还是你看的不仔细
ak47iej
2023-12-04 15:24:34 +08:00
这不是 windows cmd 祖传特性吗....
ShadowPower
2023-12-04 15:26:41 +08:00
对了,Windows 的 cmd 一直以来都不是用来兼容 Unix 的东西,而是兼容 DOS 用的。
不少设计来自 IBM ,一直传承下来。

在标准 IBM PC 键盘上其实还有个 Pause Break 按钮,按一下就可以让程序暂停下来。

如果想要一个和 Unix 兼容的终端,过去有 MinTTY ,现在有 Windows Terminal 。
cc666
2023-12-04 15:27:16 +08:00
windows cmd 很早之前就这样了,以至于这是成为了一个 feature ,能实现一些疑难的调试工作
leeyuzhe
2023-12-04 15:27:27 +08:00
一直这样啊,这叫什么天坑。阻塞输出流方便选择不是一个很正常的逻辑么。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/997469

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX