Termux 无法正常进入 shell 时如何用 Failsafe 会话启动并排查?
2026/9/9 16:38:01 网站建设 项目流程

Termux 无法正常进入 shell 时如何用 Failsafe 会话启动并排查?

【免费下载链接】termux-appTermux - a terminal emulator application for Android OS extendible by variety of packages.项目地址: https://gitcode.com/GitHub_Trending/te/termux-app

当 Termux 启动后终端一直空白、会话瞬间退出,或者疑似 shell 启动脚本(如~/.profile)写错导致普通会话根本起不来时,可以用 Termux 内置的Failsafe 会话先进入一个可用的 shell 再做排查。Failsafe 会话刻意绕开了普通会话的启动逻辑:它不查找$PREFIX/bin下的登录 shell,而是回退到系统的/system/bin/sh(由 mksh 提供),并且不设置 Termux 的PATHTMPDIR,保留 Android 系统默认值,这样即使 Termux 前缀目录($PREFIX)下的 shell 或环境已经损坏,系统二进制命令依然可以执行。本文说明如何从 App 内或外部启动 Failsafe 会话,并在其中验证、定位问题。

Failsafe 会话与普通会话的差异

理解两者差异是判断“为什么 Failsafe 能进、普通会话不能进”的依据,相关逻辑见 TermuxSession.java 与 TermuxShellEnvironment.java:

  • 普通会话:未显式指定可执行程序时,先在 Termux 前缀的bin目录中查找登录 shell 二进制并作为登录 shell 启动。登录 shell 会加载用户 profile(如~/.profile);源码注释明确指出,若~/.profile无效“may cause startup failure”(可能导致启动失败)。这正是普通会话进不去而 Failsafe 能进来的典型场景。
  • Failsafe 会话ExecutionCommand.isFailsafetrue时):跳过登录 shell 查找,直接回退到/system/bin/sh,并且不作为登录 shell 启动,因此不会加载用户的~/.profile
  • 环境变量TermuxShellEnvironment.getEnvironment()中只有!isFailSafe时才写入 Termux 的TMPDIRPATH(指向$PREFIX/bin,Android 5/6 的 APT 变体还会附加applets目录并设置LD_LIBRARY_PATH)等;Failsafe 模式下保留系统默认PATHTMPDIRHOMEPREFIX两个变量在两种模式下都会设置。

也就是说:Failsafe 会话里,Termux 安装的包默认不在PATH上,但系统命令可用,且$PREFIX仍指向 Termux 前缀目录。

启动 Failsafe 会话的三个入口

入口一:应用快捷方式。Termux 在 shortcuts.xml 中注册了一个new_failsafe_session快捷方式,标签为Failsafe(字符串定义见 strings.xml)。长按 Termux 应用图标即可看到该快捷方式(配置中标注tools:targetApi="n_mr1",即 Android 7.1 及以上系统才显示应用快捷方式)。它的本质是向com.termux.app.TermuxActivity发送android.intent.action.RUN意图,并携带额外参数com.termux.app.failsafe_session=true

入口二:应用内长按“新建会话”按钮。在 TermuxActivity.java 的setNewSessionButtonView()中,新建会话按钮的长按会弹出会话命名对话框,对话框上提供R.string.action_new_session_failsafe(即“Failsafe”)按钮,按下后调用addNewSession(true, text)创建 Failsafe 会话(可带会话名)。

入口三:从其他应用通过 Intent 触发。与快捷方式相同:目标为com.termux包、com.termux.app.TermuxActivity类,android.intent.action.RUN动作,并加上com.termux.app.failsafe_session(布尔值)为true的 extra。适合在 Termux 卡死、无法通过界面操作时从其他终端工具或自动化脚本拉起。

在 Failsafe 会话中验证与排查

进入 Failsafe 会话后,按下面的顺序确认环境并定位问题:

  1. 确认会话类型与环境。执行:

    echo $PATH echo $PREFIX echo $HOME

    Failsafe 会话的$PATH应为 Android 系统路径(不包含$PREFIX/bin),而$PREFIX指向 Termux 前缀目录。如果$PATH已经包含 Termux 的 bin 目录,说明当前并不是 Failsafe 会话。

  2. 验证 Termux 前缀是否完好。系统命令可用、Termux 包不在PATH上,需要用绝对路径访问:

    ls $PREFIX/bin

    前缀目录存在且内容正常,说明问题大概率出在 shell 或启动脚本,而不是安装本身。

  3. 检查 shell 启动脚本。普通会话失败最常见的文档化原因是登录 shell 的 profile 脚本无效。在 Failsafe 会话中它不会被加载,因此可以安全地查看:

    cat ~/.profile

    逐段检查其中的命令与语法;修改后重新以普通会话启动验证是否恢复。

  4. 需要运行 Termux 内的程序时,用$PREFIX/bin/下的绝对路径调用,因为 Failsafe 模式下PATH不含 Termux 前缀。

需要更详细日志时:Log Level 与 Report Issue

Failsafe 会话里能看到的信息有限,进一步排查可以用 README.md “Debugging” 一节给出的方法(Log Level 功能要求 Termux 版本>= 0.118.0):

  • 在 Termux 设置中进入Termux->Debugging->Log Level。默认是NormalVerbose会记录额外信息。日志级别含义:Off不记录;Normal记录 error/warn/info 与堆栈;Debug增加 debug 消息;Verbose增加 verbose 消息。调试完成后应改回Normal,因为 Verbose 可能在正常运行中把私有数据写入logcat,且额外日志会增加执行开销。
  • 由于 Failsafe 会话保留系统PATH,可以直接在终端里运行logcat实时查看日志(Ctrl+c停止),或用logcat -d > logcat.txt导出日志;也可以通过 ADB 在 PC 端查看。
  • 还可以用长按终端选项菜单中的More->Report Issue,并在提示中加入 debug 信息(选择YES),自动生成文件stat信息与logcat转储。报告过大时,可在 ReportActivity 右上角三点菜单中使用Save To File保存后再查看或分享。提交 issue 时应附上完整文本报告,而不是错误截图。

限制与注意事项

  • Failsafe 会话本身依赖系统文件:源码注释说明/system/bin/sh由 mksh 提供,会加载/system/etc/mkshrc(而非默认的~/.mkshrc),因此/system/etc/mkshrc必须有效,Failsafe 会话才能正常启动。
  • Failsafe 不是日常工作环境:它不加载登录 shell 与 profile、PATH不含 Termux 前缀,只用于进入 shell 后做诊断;问题修复后应回到普通会话验证。
  • Termux 在 Android 12+ 上受系统 phantom 进程与 CPU 限制影响可能不稳定(README 中的 NOTICE),终端出现[Process completed (signal 9) - press Enter]不一定是 shell 脚本本身的问题;这与 Failsafe 排查是两条独立线索,先确认 Failsafe 会话能否进入,再区分是进程被系统终止还是启动脚本失败。

【免费下载链接】termux-appTermux - a terminal emulator application for Android OS extendible by variety of packages.项目地址: https://gitcode.com/GitHub_Trending/te/termux-app

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询