Drush运行命令导出结果生成空文件、提示重找ms命令的问题求助
Drush 导出迁移状态文件为空、ms命令无法识别的排查方案
问题本质定位
从你贴的调试日志[debug] Done with bootstrap max in Application::find(): trying to find ms again.可以判断,当前两个异常存在直接因果关联,并非孤立的偶发故障:
- 最终生成的导出文件为空,不是写入流程的问题,是目标命令根本没有正常执行,没有产出可导出的内容
- Drush已经走完了能访问到的最高层级Drupal引导流程,依然没有加载到
ms(即Migrate Tools模块提供的migrate-status命令),才会触发二次扫描命令列表的逻辑,自然不会输出迁移状态内容
注:不要直接采信主机服务商泛化的“Drush本身异常”结论,这类跨服务器同操作可正常运行的场景,大多是配置错位导致,并非Drush软件本身存在核心bug。
分步排查操作
1. 先修正命令的解析逻辑问题
- 原命令的写法存在解析冲突风险:
drush @sited8bl.preprod ms > 导出文件路径 --debug中,重定向符和参数的穿插排布,容易让Drush的参数解析器混淆,建议调整为标准顺序:先放全局参数,再放站点别名、目标命令,最后接重定向
修正后的基础执行格式为:drush --debug @sited8bl.preprod ms &> 导出文件路径
这里把单流重定向>改成&>,可以同时捕获标准输出流、错误输出流的内容——如果之前文件为空是因为命令报错走了错误流,调整后就能看到真实的报错信息,不会再生成空文件。 - 先不接任何重定向,手动执行一次修正后的命令,看全量返回的报错:如果最终提示
Command "ms" is not defined,就顺着命令缺失的方向排查,不要在导出流程上浪费时间。
2. 定位ms命令无法识别的根因
ms是Migrate Tools模块提供的专属命令,正常情况下必须在Drupal站点完整引导、模块成功加载后才能被Drush识别,出现找不到的问题就顺着以下维度核对:
- 逐行对比正常服务器和异常服务器的同环境配置:
- 核对Drush版本:多站点场景下经常出现全局安装的Drush版本和站点内置的Drush版本不兼容的情况,比如全局Drush版本过高,无法匹配当前老版本Drupal配套的Migrate Tools模块,就会出现命令识别失败
- 执行
drush @sited8bl.preprod status,核对引导完成度:如果引导没有走到加载完整Drupal内核的阶段,是根本扫描不到业务模块提供的命令的
- 检查模块加载链路:
- 确认当前执行Drush的用户,有没有权限读取对应站点下的Migrate Tools模块目录,权限不足会导致Drupal加载模块时直接跳过,自然不会注册对应命令
- 确认Composer的自动加载缓存是否正常:如果migrate_tools的自动加载规则没写入autoload文件,就算模块目录存在,也会被Drush识别为未安装状态
- 清除命令缓存:Drush会缓存已经注册的命令列表,异常场景下可以手动执行
drush @sited8bl.preprod cr清空站点缓存,再重新查找ms命令,排除缓存错位导致的查找失败。
3. 导出文件为空的附加排查点
- 确认导出目录的权限:当前执行Drush的用户,需要对目标导出目录有写入权限,如果权限不足,就算文件被shell创建,内容也无法写入,最终就是空文件
- 确认路径解析正确:原命令里用
$(date +%Y%m%d_%H%M%S)动态生成文件名的写法,要确认当前执行shell的版本支持命令替换,避免生成的路径存在特殊字符导致写入失败
内容的提问来源于stack exchange,提问作者webmaster pf
相关产品推荐
相关产品推荐

