ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

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

Termux 无法正常进入 shell 时如何用 Failsafe 会话启动并排查? 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 的PATH与TMPDIR保留 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.isFailsafe为true时跳过登录 shell 查找直接回退到/system/bin/sh并且不作为登录 shell 启动因此不会加载用户的~/.profile。环境变量TermuxShellEnvironment.getEnvironment()中只有!isFailSafe时才写入 Termux 的TMPDIR、PATH指向$PREFIX/binAndroid 5/6 的 APT 变体还会附加applets目录并设置LD_LIBRARY_PATH等Failsafe 模式下保留系统默认PATH和TMPDIR。HOME和PREFIX两个变量在两种模式下都会设置。也就是说Failsafe 会话里Termux 安装的包默认不在PATH上但系统命令可用且$PREFIX仍指向 Termux 前缀目录。启动 Failsafe 会话的三个入口入口一应用快捷方式。Termux 在 shortcuts.xml 中注册了一个new_failsafe_session快捷方式标签为Failsafe字符串定义见 strings.xml。长按 Termux 应用图标即可看到该快捷方式配置中标注tools:targetApin_mr1即 Android 7.1 及以上系统才显示应用快捷方式。它的本质是向com.termux.app.TermuxActivity发送android.intent.action.RUN意图并携带额外参数com.termux.app.failsafe_sessiontrue。入口二应用内长按“新建会话”按钮。在 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 会话后按下面的顺序确认环境并定位问题确认会话类型与环境。执行echo $PATH echo $PREFIX echo $HOMEFailsafe 会话的$PATH应为 Android 系统路径不包含$PREFIX/bin而$PREFIX指向 Termux 前缀目录。如果$PATH已经包含 Termux 的 bin 目录说明当前并不是 Failsafe 会话。验证 Termux 前缀是否完好。系统命令可用、Termux 包不在PATH上需要用绝对路径访问ls $PREFIX/bin前缀目录存在且内容正常说明问题大概率出在 shell 或启动脚本而不是安装本身。检查 shell 启动脚本。普通会话失败最常见的文档化原因是登录 shell 的 profile 脚本无效。在 Failsafe 会话中它不会被加载因此可以安全地查看cat ~/.profile逐段检查其中的命令与语法修改后重新以普通会话启动验证是否恢复。需要运行 Termux 内的程序时用$PREFIX/bin/下的绝对路径调用因为 Failsafe 模式下PATH不含 Termux 前缀。需要更详细日志时Log Level 与 Report IssueFailsafe 会话里能看到的信息有限进一步排查可以用 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实时查看日志Ctrlc停止或用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),仅供参考
返回列表