研究 termux 時遇到的詭異的問題

想法

手上有個舊的Android 手機 MI 5 plus閒置了兩年,性能還相當不錯的,就是屏幕被我摔花了,最近總想着讓他發揮點價值。

突然想到能不能用它當小型Linux服務器放在家裏,用內網穿透工具 frp 將他的sshd 服務端口轉發的公網的服務器上, 這樣在外面就可以通過這臺公網服務器連接上這個 linux 服務器 。

探索

一番網絡搜索研究 發現兩種方案:

  • 第一種安裝 linux deploy,比較大, 需要 root
  • 第二種 用 termux,能訪問有限的目錄文件,可以安裝各種Linux 應用,

果斷選擇了termux, 不想 root. 順利安裝了 python, gcc, openssh 等軟件 。。。通過frp的客戶端frpc連接上公網, 從公司 ssh連接上了這個 5plus ,爽歪歪。

障礙

但是-- 有個奇怪的問題, 每隔一分多鐘會斷開。 各種 ssh, frp客戶端日誌和服務器日誌檢查,發現是 frp客戶端每隔 1分多鐘會斷開。

這個問題困擾了我幾個星期,一開始還懷疑是運營商 每幾分鐘重置鏈接。但是我電腦上的 frpc 卻沒事。。。

源代碼分析

後來分析frp的golang源碼,打開詳細日誌 發現, 服務器上超時時間是90秒,客戶端心跳上報時間是30秒, 而termux 上運行的frpc,服務器上顯示的是超時,超時後會斷開客戶端,然後frp客戶端會馬上重連, 這個時間設定無論如何都不應該超時呀。 自己編譯一邊, 同樣代碼編譯的frp客戶端程序在mac電腦上運行卻沒問題,日誌中看到每隔30秒會發布心跳。但是這個心跳日誌在termux上沒有。很是困惑呀, 仔細閱讀代碼。

於是開始懷疑是代碼中的心跳定時器在電腦上和在手機上的時間不一樣。 於是寫了個最簡單的go程序,定時每隔1秒輸出包含時間信息到日誌。在電腦上輸出正常。 放到termux上去執行,發現了非常詭異的結果,輸出的時間信息,並不是每秒輸出,幾乎是每隔6到 7秒中,但是我到定時器是每隔1秒啊!! wfk, 這是什麼情況,太不可思議了

就這個定時器不準到問題再次去google 了一番,發現是Android深度睡眠導致的,爲了減少耗電,後臺程序的運行很慢,連timer定時器也不例外。

除掉障礙(解決辦法)

在手機上termux裏面執行termux-wake-lock命令 ,手機會彈出是否運行後臺執行的,選擇允許就好了,

然後在去 termux再次frp客戶端,哈哈,終於不會頻繁掉線了!不容易呀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章