django命令卡死问题解决

本文介绍了解决Django命令在执行过程中可能出现的假死现象的方法。提供了两种方案:一是通过创建临时文件记录进程ID及超时时间并定期检查;二是采用主进程监控子进程的方式,并设置超时时间来终止未响应的命令执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

         1、可能由于网络原因,导致django命令在多次定时器运行后,会出现假死,启动的那一刻就卡死,不执行任何代码

         2、可能由于连接数据库异常导致假死

         3、其他未知原因,如果有遇到的,或者知道原因的,希望得到指教

解决办法:

       办法1、

                1、在命令启动的时候把命令对应的进程ID号,以及超时时间,写到一个临时文件中

                2、写一个定时服务不停的扫描文件中的进程ID,超时时间,如果发现超时,则杀死

                3、这个办法,后面发现对于我的业务是不可行的,原因是命令启动,假死,压根就

                      没有执行任何代码,没有把PID和超时时间写到临时文件中

                4、对于其他在不是在启动的时候假死的情况,是可以用的    

# -*- coding: utf-8 -*-
import os
import time
import sys
import datetime
import traceback
import tempfile
import logging

COMMAND_PID_ROOT_PATH = os.path.join(tempfile.gettempdir(),"command_pids")

def get_log(file_name):
    LOG_DIR = "/var/log/mylog/" #日志目录

    if os.name != "posix":
        LOG_DIR =  os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]

    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR)
        
    path = os.path.join(LOG_DIR,file_name)
    logger = logging.getLogger()
    hdlr = logging.FileHandler(path)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)
    logger.setLevel(logging.NOTSET)
    return logger

logger = get_log("monitor_cmds.log")

def monitor():
    logger.info("****staring monitor commands*****")
    expire_minutes = 90 #进程运行过期时间

    if not os.path.exists(COMMAND_PID_ROOT_PATH):
        os.mkdir(COMMAND_PID_ROOT_PATH)

    datas = os.listdir(COMMAND_PID_ROOT_PATH)
    pid_infos = []
    for f in datas:
        file_path = os.path.join(COMMAND_PID_ROOT_PATH,f)
        if os.path.isfile(file_path):
            fid = file(file_path,"r")
            fdata = fid.read() #文件中内容格式为{pid}|{start_time}
            fid.close()
            d = fdata.split("|")
            d.append(file_path)
            pid_infos.append(d) 
            
    dt_now = datetime.datetime.now()
            
    for pid,start_time,file_path in pid_infos:
        start_time_d = datetime.datetime.strptime(start_time,"%Y-%m-%d %H:%M:%S")
        end_time  = start_time_d + datetime.timedelta(minutes = expire_minutes)
        
        if end_time <= dt_now: #超时了
            kill_cmd = "kill -9 %s"%pid
            if os.system(kill_cmd) == 0:
                logger.info(
                    "success kill pid info pid='%s',start_time='%s',file_path='%s'"%(
                         pid,start_time,file_path,
                        )
                )
            else:
                logger.info(
                    "fail kill pid info pid='%s',start_time='%s',file_path='%s'"%(
                         pid,start_time,file_path,
                        )
                )

    logger.info("****ending monitor commands*****")

if __name__ == "__main__":
    monitor()

办法2、

              1、通过主进程,动态生成一个子进程的方式运行django命令Popen

              2、父进程一直监控子进程状态,如果超时,子进程还未结束,则杀死

    例子如下:

                */5 * * * * flock -xn  /tmp/test.lock  -c  'python /var/www/test_prj/monitor_cmd.py "python /var/www/test_prj/manage.py test_cmd" 60'

     解释:

              1、flock是为了防止定时器还未结束的时候,又重新启动执行,导致一个命令多个进程执行

              2、django 命令  python /var/www/test_prj/manage.py test_cmd  通过monitor_cmd.py 主进程文件监控,超时时间为60秒

              3、monitor_cmd.py 源代码如下,希望对有需要的人有所帮助

# -*- coding: utf-8 -*-
import os
import time
import sys
import datetime
import traceback
import tempfile
import subprocess
import shlex
import logging

__doc__ = u"""
    该文件所使用的库都和django没有联系,防止因使用了django中的库,导致卡死,
    所以包括文件的读写,都是原生的python库
"""


def get_log(file_name):
    LOG_DIR = "/var/log/mylog/" #日志目录

    if os.name != "posix":
        LOG_DIR =  os.path.split(os.path.abspath(os.path.dirname(__file__)))[0]

    if not os.path.exists(LOG_DIR):
        os.mkdir(LOG_DIR)
        
    path = os.path.join(LOG_DIR,file_name)
    logger = logging.getLogger()
    hdlr = logging.FileHandler(path)
    formatter = logging.Formatter('%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s')
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)
    logger.setLevel(logging.NOTSET)
    return logger

logger = get_log("monitor_cmd.log")

if __name__ == "__main__":
    u"""
       python3 monitor_process.py  'python3 test_xxx.py' 5
    """
    args = shlex.split(sys.argv[1])
    timeout = int(sys.argv[2]) #秒
    print("command='%s'"%args)
    print("timeout='%s'"%timeout)
    child = subprocess.Popen(args)
    start_time = time.time()
    while True:
        is_end = child.poll()
        end_time = time.time()
        if is_end == 0: #子进程正常结束
            logger.info(
                "args='{args}' normal end pid='{pid}'".format(
                    args=args,
                    pid=child.pid,
                )
            )
            break
        elif int(end_time - start_time)>timeout: #超时
            logger.info(
                "args='{args}' timeout kill child pid='{pid}'".format(
                    args=args,
                    pid=child.pid,
                )
            )
            child.kill()
            break
        else:
            print("sleep 3")
            time.sleep(3)

    logger.info("args='{args}' ending".format(args = args))

 

 

 

 

 

 

'

### PyCharm 中使用 Django 出现无响应问题的原因分析与解决方案 在开发过程中,如果遇到 PyCharm 使用 Django 项目时出现 `not responding` 或卡死的情况,可能是由多种原因引起的。以下是可能的原因及其对应的解决方案: #### 1. **环境配置错误** 如果虚拟环境中未正确安装依赖包或者版本不匹配可能导致运行异常。例如,引用中提到通过命令行验证 Django 版本的方式可以确认当前环境是否正常工作[^1]。 解决方案: - 确认项目的虚拟环境已激活并检查所需库是否全部安装。 - 执行以下命令重新安装或更新 Django 库: ```bash pip install --upgrade django ``` #### 2. **调试模式下的性能瓶颈** 调试器可能会因为加载过多数据而变得缓慢甚至无响应。这通常发生在处理大量查询或其他耗时操作时。 解决方法: - 尝试禁用某些插件来减少内存占用。 - 修改设置以优化调试体验:进入 `File -> Settings -> Build, Execution, Deployment -> Debugger` 并调整相关选项。 #### 3. **代码逻辑中的阻塞调用** 某些特定函数(如长时间运行的任务)如果没有适当异步化也可能导致界面冻结现象发生。比如视图文件编写不当会引发此类状况[^2]。 建议措施: - 审查业务实现部分是否存在同步等待时间过长的操作; - 对于需要执行较复杂计算的功能考虑采用 Celery 等工具完成后台作业调度管理。 #### 4. **IDE 自身局限性** 高负载情况下即使是优秀的 IDE 如 JetBrains 提供的产品也难以完全避免崩溃风险。因此当发现频繁出现问题时可尝试更换其他编辑器测试效果差异如何。 替代建议: - 利用 VSCode 结合官方扩展支持快速搭建相同功能框架结构的同时保持轻量化特性从而降低硬件需求压力; #### 5. **系统资源不足** 当计算机可用 RAM 和 CPU 核心数量不足以支撑大型应用程序启动过程中的临时消耗量级时同样容易触发类似的症状表现形式之一即表现为程序假死状态无法继续向前推进进度条直至超时退出为止。 改善策略: - 关闭不必要的后台进程释放更多物理存储空间给前端展示层渲染服务端接口返回的数据集内容呈现出来让用户能够直观感受到交互反馈及时有效果显著提升用户体验满意度水平达到预期目标值范围内合理范围之内即可满足大多数实际应用场景的需求标准要求条件限制前提下尽可能做到最好程度上的平衡兼顾效率质量两方面因素综合考量最终得出结论如下所示: ```python import psutil def check_system_resources(): memory_usage = psutil.virtual_memory().percent cpu_usage = psutil.cpu_percent(interval=1) if memory_usage > 80 or cpu_usage > 70: print(f"Warning! Memory usage is at {memory_usage}% and CPU usage is at {cpu_usage}%. Consider upgrading hardware.") ``` --- ### 总结 上述列举了几种常见引起 PyCharm 在 Django 开发期间可能出现 “Not Responding” 的情况以及相应的应对办法。具体实施前还需结合个人实际情况灵活运用以上技巧找到最适合自己的解决途径[^3][^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值