Termux里的二进制和脚本,到底怎么运行才不踩坑?Termux-service 保活妙招!
第一部分Termux 里运行个东西咋就这么费劲Termux 说白了就是一个在 Android 上运行的容器化 Linux 环境但它没有传统的 init 系统也不享受系统级服务的“免死金牌”。Android 的省电机制Doze 模式、电池优化会把后台进程当成吃电的流氓一言不合就查杀。所以你会遇到 关闭终端或者锁屏后进程直接被干掉 切换应用再回来之前跑的任务莫名其妙消失了 用放到后台的进程依然逃不过被系统回收的命运那到底怎么选择运行方式别急先给你一个全景图。⚙️ 第二部分运行方式全家福一张表看懂 方式一直接在前台运行./binary或者bash script.sh这就好比你在灶台前守着锅你一走开火就灭了。只在调试、临时跑一下的时候用千万别想着这样能持久运行。 方式二使用放到后台./binary 看起来任务被扔到后台了但本质上还是挂在当前 shell 会话下终端一关进程就收尸。这里有一点要特别注意很多新手觉得加了 就万事大吉结果睡一觉服务挂了就是这个原因。️ 方式三nohup 或 disown 扛住终端关闭nohup ./binary 或者./binary disown这样终端退出后进程不会被 SIGHUP 信号杀死。但听好了——这只能防止你主动关终端时进程被杀挡不住 Android 系统在锁屏后的后台限制。我就在这上面栽过跟头半夜服务停了还以为程序自己崩了查了半天 log 才发现是被系统祭天了。 方式四termux-wake-lock 防止 CPU 休眠先执行termux-wake-lock获取唤醒锁再运行程序。这样锁屏后 CPU 能继续保持活跃能提高存活率但应用本身还是可能被杀死释放内存。这是一种“强力辅助”不是免死金牌。 方式五Termux-service 正式登场这才是今天的重头戏。Termux-service 实际上就是一套让 Termux 可以管理类似“系统服务”的工具集底层通过runit或busybox管理进程帮你实现 进程挂了自动拉起来 Termux 启动后自动运行服务 用sv命令管理启停像个正经 Linux 一样官方文档虽然说明了基本用法但根据以往的经验直接抄容易因为目录权限或脚本环境变量问题启动失败所以下面我会用亲手验证过的步骤带你走一遍。️ 第三部分实战Termux-service 安装与配置 第一步安装 termux-servicespkg update pkg upgradepkg install termux-services安装完务必重启一次 Termux 或者重新打开一个会话不然很多服务命令会报找不到。 第二步创建你的服务目录服务文件需要放在$PREFIX/var/service/你的服务名/下面。我习惯用myserver举例子mkdir -p $PREFIX/var/service/myserver在该目录下创建一个名为run的可执行脚本这就是服务的启动脚本。重点来了这个脚本必须在前台执行不能自己退到后台。因为 runit 要求它监控的这个 run 进程一直活着一旦退出就认为服务挂了。写个最简单的例子#!/data/data/com.termux/files/usr/bin/bashcd /sdcard/myappexec python server.py 一定要用exec把当前 shell 替换成你的服务进程这样信号能正确传递。 脚本里用绝对路径别偷懒写相对路径否则服务启动时会因为$PATH不一样翻车。✅ 第三步赋予执行权限并启用服务chmod x $PREFIX/var/service/myserver/run然后让 Termux-service 接管sv up myserver # 启动服务sv status myserver # 查看状态显示 run: 字样就是跑起来了设置开机自启那就更简单了安装好termux-services后只要重启一次 Termux 或重开一个会话背后的runsvdir守护进程就会自动跑起来它会监控$PREFIX/var/service/这个目录。只要你把服务目录比如myserver放在里面你一打开 Termux它就会自动把里面所有服务拉起来根本不用手动干预。 手机开机后自动启动服务系统级自启这才是真正的“开机自启”光靠 Termux-service 自己搞不定必须搭档Termux:Boot这个插件。pkg install termux-boot安装Termux:Boot后在~/.termux/boot/目录下放一个可执行脚本里面写上#!/data/data/com.termux/files/usr/bin/bashtermux-wake-locksv up myserver这样手机一开机这个脚本就会被触发先拿唤醒锁再启动你的服务。这才是真·开机自启的完整链条。 第四步验证保活效果可以先sv down myserver停止服务然后再sv up myserver重新拉起来接着模拟锁屏等待几分钟再回来看状态如果还是run基本就稳了。再教一个损招可以故意kill掉你的服务进程等几秒再sv status看只要配置对了它应该自动被拉起来原地复活。 第四部分常见翻车现场及抢救方案启动报错 “run: cant change directory…”大概率是路径拼错了或者没有访问权限。Termux 访问/sdcard需要先执行termux-setup-storage授权。服务启动了但马上又 down 掉多半是run脚本执行完直接退出了。记住run 脚本必须阻塞运行直到服务本身停止。如果你在脚本最后写了echo done就没了那 runit 一看进程结束了当然认为服务跪了。我就曾经因为脚本末尾多了一个换行导致 exec 没生效服务秒挂找了好一阵才恍然大悟。锁屏后服务还是被杀了即使用了 Termux-service碰上凶残的系统比如某些国产 OS还是可能被杀。这时候需要组合拳开启 Termux 的唤醒锁再把 Termux 应用本身加入系统的“电池优化”白名单并在多任务界面锁定应用不被清理。工具顺手的才是最好的我一般还会装个Termux:Boot让手机开机就自动启动 Termux 服务。sv 命令提示 “command not found”说明 termux-services 没装好或者新开的 session 没加载环境变量。试试source $PREFIX/etc/profile或者退出 Termux 重新进。