Termux后台总被系统杀掉,正在跑的任务怎么保住
用手机Termux连着VPS跑一个耗时的任务,切个微信回来一看,会话断了,任务也没了,跟没跑过一样。这不是Termux不稳定,是安卓系统的省电机制在暗中动手——手机为了省电,会主动清理它认为"不重要"的后台进程,Termux作为一个终端应用,很容易被系统划进这个清理名单。
第一层防护:唤醒锁+电池白名单
最基础的两步,跑长任务之前先做好:
在Termux菜单里点"Acquire Wakelock",或者直接敲命令:
1 | termux-wake-lock |
这个操作能阻止CPU进入深度睡眠,任务跑完之后记得释放:
1 | termux-wake-unlock |
同时去手机系统设置里,把Termux的电池优化策略改成"不受限制"(不同手机厂商叫法不一样,可能是"无限制""允许后台活动"之类),避免系统按默认的激进策略清理它。
第二层防护:把任务放进tmux,而不是直接跑在主会话里
单纯开着wake-lock还不够稳妥,配合之前写过的SSH断连处理方法,把任务放进tmux会话里跑,就算Termux本身被系统重启或者意外重开,只要底层进程没被真正杀死,重新连回去还能接上:
1 | tmux new -s 任务名 |
安卓12/13上,做完前两步可能还是不够
这是最容易被忽略、也最让人困惑的一层——安卓12和13新增了一个叫"Phantom Process Killer"(幽灵进程终结者)的机制,就算唤醒锁开着、电池优化也关掉了,这套新机制依然可能把你的后台会话干掉,因为它管的是另一套判定逻辑,不完全受传统的电池优化设置约束。
遇到这种情况,需要通过ADB命令单独放宽这个限制(需要电脑连接手机执行,或者用Termux本身的ADB无线调试功能):
1 | adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647" |
这条命令把系统允许的"幽灵进程"数量上限调到接近无限大,绕开这套新的杀后台机制。
一个容易被忽视的反向陷阱
设置好前面这些之后,千万别手动开启手机的"省电模式"——这个模式会直接覆盖掉唤醒锁的效果,不管你之前设置得多仔细,一旦手动打开省电模式,后台任务照样立刻被杀,等于前功尽弃。
如果想让tmux会话在手机重启之后也能自动恢复,可以研究一下tmux-resurrect这个插件,能把会话状态保存下来,重启后自动还原。
顺带一提
这种"系统默认倾向于清理你没有特别保护的东西"的思路,跟Linux里kill -9都杀不死一个进程那篇讲的其实是完全相反的情况——一个是"太容易被杀掉",一个是"怎么杀都杀不掉",两种极端背后都是系统在某种机制下的默认行为,了解清楚各自的逻辑,才知道该往哪个方向去应对。如果手机上除了Termux还跑着Mdpings这类需要常驻后台的探针App,同样的保活思路也适用,都得先过电池优化这一关。