adb shell 執行後臺程序後斷開adb後臺進程被結束的解決辦法

環境:Android 版本 Android8

通常讓程序後臺執行就是在命令 最後加上 &即可,但是在Android 8上實驗發現,程序的確後臺了,但是拔掉USB線再連接上發現進程已結束。不確定Android早期版本是否存在此問題。

參考網上一些Linux方法,如加nohup 仍然無效,還是會結束。看來Android adb shell 與 Linux shell 還是有一定區別。

後來在網上查到進程被結束的原因,說是使用exit 退出不會導致後臺結束。所以就嘗試 先使用exit 退出,再拔掉USB。發現的確有效。但是仍必須使用nohup指令。

 

實測 setsid 與 nohup 區別:setsid噹噹前用戶退出,進程就結束了,nohup不會。

神奇的事情,一開始 使用nohup 一直不行的,後來又可以了,奇怪,經反覆試驗,這是概率性的,時而不會結束時而會。

擴展:導致進程結束的幾個信號:1、2、3、9、15的SIGHUP、SIGINT、SIGQUIT 、SIGKILL、SIGTERM

SIGHUP是當終端斷開時發出的,加nohup就是解決終端連接斷開導致進程結束的。經驗證未加nohup前使用kill -1 進程號,可以殺死進程,增加nohup後使用kill -1 進程號無法結束進程。說明拔掉USB進程仍會概率結束應該是其他信號導致的。

SIGINT一般是CTRL + C產生的,

SIGQUIT 當用戶在終端上按退出鍵(一般採用Ctrl +  ), 中斷驅動程序產生此信號, 併發送給前臺進程組中的所有進程.

SIGKILL無法忽略,強制結束進程

SIGTERM  kill命令默認發送的終止信號

爲了找出斷開USB是哪個信號導致進程結束,特意連接了串口終端和USB adb終端

在USB 終端執行後臺進程,在串口終端執行strace -p 進程號 監視進程,然後斷開USB 發現進程是由於收到SIGKILL 退出的。

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