在Linux上启动Android的持续后台进程

6

假设我有一个简单的可执行Linux程序,它在循环中无限运行,直到明确停止。我想以这样的方式部署它,即使在我断开Android设备的USB电缆后,它也能继续运行。当我尝试像这样运行程序时,

$adb shell
<android_shell>$ /path/to/dir/myprog &

我可以断开电线,当我重新连接它并执行以下操作时

$ps | grep myprog

我仍然可以看到它在运行。

但是,当我尝试以这种方式运行它时,

$adb shell /path/to/dir/myprog &

一旦我断开连接,进程就会被杀死,我就无法再用ps找到它。

1)这两种执行命令的方式有什么区别?

2)是否有一种方法可以在桌面终端上运行命令以达到我想要的效果?

1个回答

5

android_shell>$ /path/to/dir/myprog &

这个进程正在您设备的后台运行。在设备内使用ps命令查看。

$adb shell /path/to/dir/myprog &

这个进程正在您的开发PC的后台运行,显然,当拔掉连接线时,adb进程与adbd守护程序的套接字连接会被终止。[编辑]

解决方法:使用nohup命令。

adb shell "nohup /path/to/dir/myprog &"

[编辑]

正如LieRyan所提到的,"是很重要的。

nohup-

在shell中,挂起信号可以通过&将你的进程放在后台,但这可能会导致进程被杀死。nohup能够捕捉到SIGHUP挂起信号并忽略它,从而避免影响应用程序。 在adb shell中,&仍然有效,但我曾经遇到过由于某些未知原因导致进程被杀死的问题。当时我无法找出原因(导致adb shell被终止的原因)。但使用nohup后,我从未遇到过任何问题。


2
这里重要的部分是引用&符号。如果没有引用,&符号会被PC的shell处理为将本地adb进程后台运行,而不是传递给Android的shell。 - Lie Ryan
@Rilwan。你的论点很有说服力。但是,这并不是真的。当你执行$adb shell /path/to/dir/myprog &时,实际上你是在调用shell,而shell启动进程,所以父进程实际上仍然是shell。正确的答案是Lie Ryan提到的。没有引号,终端会将我的命令视为后台进程,而不是我的命令中的参数,这是我的实际意图。添加引号解决了问题。因此,$adb shell "/path/to/dir/myprog &"完全解决了我的问题。在这种情况下,不需要使用nohup。 - shaveenk
1
@LieRyan如果您能将您的评论作为答案发布,我会接受它。 - shaveenk
@shaveen 我编辑了答案,很抱歉这个时候进行编辑。虽然我在答案中放了 ",但实际上我忘记提到它了。@LieRyan 我完全同意你的观点。 - Rilwan
就此而言,它仍然可以在谷歌和三星的设备上运行(截至Android 11 beta版本),但是在LG V30、华为P40 Lite E、Fire平板电脑以及可能还有许多其他设备上会失败。该解决方案在这些设备上挂起,并且一旦设备被拔掉,进程仍将终止。 - 3c71

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接