“如何使用su -c将单个命令作为后台进程运行

时间:2011-11-13 19:36:15

标签: bash shell unix adb

手动运行,

adb shell
su
chmod 666 /dev/graphics/fb0
export CLASSPATH=/data/local/device.jar
export LD_LIBRARY_PATH=/data/local
exec app_process /system/bin com.device.client.Main /data/local/device.conf &

按预期执行。

但是,尝试使用以下命令从bash脚本运行此命令无法按预期工作。

adb shell "su -c '
chmod 666 /dev/graphics/fb0
&& export CLASSPATH=/data/local/device.jar
&& export LD_LIBRARY_PATH=/data/local
&& exec app_process /system/bin com.device.client.Main /data/local/device.conf &'"

它没有&amp ;,但是和&它只是不会启动二进制文件。 exec app_process必须是后台进程。

shell可能会执行二进制文件,但之后就会死掉,因为它不会等待其他任何东西,但我不知道如何修复它。制作su后台进程应该这样做,“&”但它没有用。

在没有&的情况下运行时,我们得到:

D/su ( 1728): 0 /system/bin/sh executing 0 
D/su ( 1728): chmod 666 /dev/graphics/fb0
D/su ( 1728): && export CLASSPATH=/data/local/device.jar
D/su ( 1728): && export LD_LIBRARY_PATH=/data/local
D/su ( 1728): && exec app_process /system/bin com.device.client.Main /data/local/device.conf using shell /system/bin/sh : sh

添加&时,我们得到:

D/su ( 1746): 0 /system/bin/sh executing 0 
D/su ( 1746): chmod 666 /dev/graphics/fb0
D/su ( 1746): && export CLASSPATH=/data/local/device.jar
D/su ( 1746): && export LD_LIBRARY_PATH=/data/local
D/su ( 1746): && exec app_process /system/bin com.device.client.Main /data/local/device.conf & using shell /system/bin/sh : sh

但没有任何东西被加载!

如何运行我的命令集,确保app_process将在后台运行?

2 个答案:

答案 0 :(得分:4)

我没有adb(它是一个旧的调试器权限),但是将一组命令传递给su命令的良好语法是:

su -c bash <<END_BASH
chmod 666 /dev/graphics/fb0
export CLASSPATH=/data/local/device.jar
export LD_LIBRARY_PATH=/data/local
exec app_process /system/bin com.device.client.Main /data/local/device.conf &
END_BASH

答案 1 :(得分:0)

由于这是一个古老的问题,我只想记录一下适用于特定命令sleep 30的内容,如Shellter的注释中所建议:

adb shell "su -c 'cd /data/local/tmp && nohup sleep 30 > /dev/null &'"

cd /data/local/tmp部分是必需的,因为nohup抱怨/是不可写的。 为了避免dev/null创建的nohup文件过大,重定向到nohup是必要的(因为您要分离,所以您实际上并不关心stdout)。我知道sleep不会输出任何内容,但这是通过将命令输出到stdout的命令完成的。

运行此命令后,如果执行ps -ef | grep sleep,则将看到两个进程正在运行,其中一个是sush -c cd /data/local/tmp && nohup sleep 30 > /dev/null &。您可以通过adb安全地杀死它,仅保留sleep 30

您可以将sleep 30替换为任何其他命令。我猜您可以改为运行bash脚本。