Bash脚本:使用su -c运行后台进程时的奇怪问题

时间:2011-11-13 22:25:45

标签: bash unix scripting process

我的终端中有一个非常奇怪的问题,如果我以这种方式加载我的二进制文件:

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'"

然后二进制加载正常,但它是前台进程,并且adb shell在我杀死程序之前不会返回。显然。

现在这是奇怪的事情,如果我想将app_process作为后台进程并添加&最后:

&& exec app_process /system/bin com.device.client.Main /data/local/device.conf &'"

看起来它会立即终止。我试着加入睡眠:

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 & && sleep 50'"

程序运行50秒,但之后,adb shell返回命令行,程序终止。 (我的程序有一个等待套接字连接的while(true)循环,所以它永远不会终止。)

没有生成任何错误或任何错误。在50秒的睡眠期间,如果我做adb shell和ps,我会看到“app_process”,但是在50之后,它就不再存在了,我的命令行又回到了我的计算机上接收输入。

我真的不确定发生了什么。看起来像作为后台进程运行使得“su”返回到adb的shell,shell退出,程序终止。如果是这种情况,我该怎么办呢?

非常感谢。

1 个答案:

答案 0 :(得分:0)

这类问题的常见答案是使用nohup(1)并重定向stdin,stdout和stderr,以避免任何描述符对终端开放。试试这个:

exec nohup app_process /system/bin com.device.client.Main\
/data/local/device.conf >/tmp/out 2>/tmp/err </dev/null &