Django项目执行makemigrations等命令时终端卡死无响应
排查数据库连接问题
卡死大概率是阻塞在IO操作,先检查settings.py里的DATABASES配置,确认数据库服务正常运行,端口、用户名密码无误。手动用数据库客户端(比如psql、mysql命令行)连接项目配置的数据库,看能不能正常访问。如果能连上,再查是否有未提交的事务或锁表:PostgreSQL用SELECT * FROM pg_locks WHERE NOT granted;,MySQL用SHOW ENGINE INNODB STATUS;排查锁资源。检查App的信号或模型初始化代码
makemigrations、createsuperuser这类命令会触发模型加载和信号执行,如果某个App的models.py里有模块级别的耗时操作(比如远程API调用、无限循环),或者信号(post_save、pre_save等)里有阻塞逻辑,会导致命令启动时卡死。可以临时注释掉部分INSTALLED_APPS,逐个排查是哪个App出的问题,找到后重点检查该App的models.py、signals.py里的非函数内初始化代码。排查第三方依赖冲突或版本问题
回忆最近是否安装/更新过第三方包,有些包可能和当前Django版本不兼容,或者在命令执行时触发了阻塞逻辑。可以新建虚拟环境,只安装项目requirements.txt里的包,测试命令是否正常。如果正常,逐个添加最近更新的包来定位问题。检查Django配置文件的异常逻辑
查看settings.py里是否有模块级别的执行代码(比如读取外部配置、启动线程、连接外部服务),这些代码可能在命令启动时阻塞。可以临时简化settings.py,只保留基础配置(INSTALLED_APPS、DATABASES、SECRET_KEY等),测试命令是否正常,再逐步加回配置排查。查看系统资源占用
命令卡死时,用top或htop查看CPU、内存占用,看是否有进程占用过高资源导致无响应。同时检查磁盘空间是否充足,磁盘满了也会导致命令阻塞。启用Django调试日志定位阻塞点
在settings.py里添加DEBUG级别的日志配置,执行卡死的命令,看日志输出到哪一步停止,定位具体阻塞位置。示例配置:LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'root': { 'handlers': ['console'], 'level': 'DEBUG', }, }
内容的提问来源于stack exchange,提问作者Binary_Beast

