手动运行,
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将在后台运行?
答案 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脚本。