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

157 天前
 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 友们有没有遇到这个问题?都是怎么解决的?

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

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

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

我印象中 conhost 还有一个问题,就是如果你按住鼠标拖动控制台窗口,你的程序也会暂停运行。具体我记不清了,现在现在基本用 Windows Terminal 了。
zenghx
157 天前
这不是 cmd 祖传的设定吗
flyqie
157 天前
@zenghx #8

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

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

选择:命令提示符

到底是天坑还是你看的不仔细
ak47iej
157 天前
这不是 windows cmd 祖传特性吗....
ShadowPower
157 天前
对了,Windows 的 cmd 一直以来都不是用来兼容 Unix 的东西,而是兼容 DOS 用的。
不少设计来自 IBM ,一直传承下来。

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

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

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

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

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

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

© 2021 V2EX