環境: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 退出的。