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

你可能感兴趣的:(android,付费专栏)