Bash运行Python脚本执行SQL文件报Text file busy错误如何解决
问题根因
Text file busy是Bash/Linux环境下的标准系统报错,核心触发逻辑是你尝试读取/执行的目标文件正被其他进程持有写入锁、或文件仍处于写入未完成状态,结合你贴出的代码,还有几处语法、路径格式的低级错误会间接触发该报错:
- 函数定义语法错误:直接把字符串常量写在函数形参位置,Python解释器解析阶段就会抛出异常
- 路径格式不兼容:硬编码的Windows原生路径
C:\Users\gsumarlin\...无法在Bash环境(Linux/WSL/Git Bash)下被正确识别,路径解析错位可能指向一个正在被系统写入的临时文件 - 缩进错误:函数内部代码没有正确缩进,脚本无法正常启动运行
- 文件占用:你要执行的SQL文件正被编辑器、备份进程等其他程序打开写入,未释放文件锁
解决步骤
- 先修正Python代码的基础问题,替换为可正常运行的版本:
import mysql.connector import os import fcntl db_config = { "user": "skynetadmin", "password": "Skynetadmin1", "host": "silmysskytest01.sing.micron.com", "database": "skynet_msa" } def execute_sql_file(file_path: str): if not os.path.isfile(file_path): raise FileNotFoundError(f"目标SQL文件不存在,请检查路径: {file_path}") # 提前加文件锁检测,直接定位占用问题 with open(file_path, 'r', encoding='utf-8') as f: try: fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB) sql_content = f.read() fcntl.flock(f, fcntl.LOCK_UN) except BlockingIOError: raise RuntimeError("SQL文件正被其他进程写入占用,请关闭相关程序后重试") # 拆分SQL语句,注意如果SQL包含存储过程、触发器等带内嵌分号的对象,不要用分号拆分,改用mysql.connector的multi=True参数执行 sql_commands = [cmd.strip() for cmd in sql_content.split(';') if cmd.strip()] cnx = mysql.connector.connect(**db_config) cursor = cnx.cursor() for cmd in sql_commands: try: cursor.execute(cmd) except mysql.connector.Error as e: print(f"跳过执行异常语句,错误信息: {str(e)}") cnx.commit() cursor.close() cnx.close() # 路径根据你运行的Bash环境调整: # WSL环境路径格式: /mnt/c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql # Git Bash环境路径格式: /c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql # 原生Linux环境就写文件的实际绝对路径 sql_file_path = "/mnt/c/Users/gsumarlin/Documents/dumps/Dump20220428/Creation of Lab WIP History.sql" execute_sql_file(sql_file_path)
- 排查并释放文件锁
- 执行
lsof 你的SQL文件绝对路径命令,查看占用该文件的进程ID,执行kill -9 进程ID释放锁;常见占用方为打开了SQL文件的Navicat、VS Code等编辑器,或正在写入文件的mysqldump、日志采集进程 - 如果是刚通过scp/ftp/导出功能生成的SQL文件,等文件大小不再变动、写入进程完全退出后再运行脚本,不要在文件写入过程中调用
- 运行脚本时使用正确命令:
python3 你的Python脚本文件名.py,不要直接给SQL文件加可执行权限后当脚本运行 - 如果是WSL环境,先执行
ls 你写的SQL文件路径确认文件真实存在、可正常读取,再运行脚本 - 如果SQL文件存放在NFS网络共享盘上,因网络文件锁机制不稳定,把文件拷贝到本地磁盘目录(比如
~/tmp/)后再执行即可
- 执行
内容的提问来源于stack exchange,提问作者GQS
相关产品推荐
相关产品推荐

