从linux在Android上启动持久化后台进程

从linux在Android上启动持久化后台进程,android,linux,adb,Android,Linux,Adb,假设我有一个简单的可执行linux程序,它在循环中无限期运行,直到显式终止。我希望能够以这样的方式部署它,即使在我断开USB电缆与Android设备的连接后,它仍能继续运行。当我试着这样运行程序时 $adb shell <android_shell>$ /path/to/dir/myprog & 我仍然可以看到它在运行 但是,当我尝试这样运行它时 $adb shell /path/to/dir/myprog & 断开电源线的那一刻,进程被终止,我无法再使用ps找到

假设我有一个简单的可执行linux程序,它在循环中无限期运行,直到显式终止。我希望能够以这样的方式部署它,即使在我断开USB电缆与Android设备的连接后,它仍能继续运行。当我试着这样运行程序时

$adb shell
<android_shell>$ /path/to/dir/myprog &
我仍然可以看到它在运行

但是,当我尝试这样运行它时

$adb shell /path/to/dir/myprog &
断开电源线的那一刻,进程被终止,我无法再使用
ps
找到它

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

2) 是否有一种方法可以从桌面终端运行命令,以实现我的目标

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外壳的情况下,
&
将起作用,但我遇到了
&
的问题,由于未知原因导致进程被终止。但无法挖掘原因(是什么导致adb外壳终止)当时。我从来没有遇到过任何问题。

这里的重要一点实际上是引用&。没有引用,PC的外壳处理&,作为本地adb进程的背景,而不是传递给Android的外壳。@Rilwan。你确实提出了一个令人信服的论点。但是,这不是真的。当你执行
$adb shell/path/to/dir/myprog&
,您实际上在调用shell,shell启动进程,因此父进程实际上仍然是shell。正确的答案是Lie Ryan提到的。没有引号,终端将我的命令视为后台进程,而不是我命令中的参数这是我的真实意图。添加引号解决了问题。因此
$adb shell”/path/to/dir/myprog&“
完全解决了我的问题。
nohup
在这种情况下不是必需的。@LieRyan如果你能将你的评论作为答案,我会接受它。@shaven我编辑了答案,很抱歉此时进行编辑。即使是
作为回答,实际上我忘了提这件事@LieRyan我完全同意你的看法。FWIW,它在谷歌和三星的设备上仍然有效(截至Android 11测试版),但在LG V30、华为P40 Lite E、Fire平板电脑和其他很多设备上都失效。解决方案挂起在这些设备上,一旦设备拔出,进程仍然终止。
adb shell "nohup /path/to/dir/myprog &"