我在根管理平板电脑上运行了一些在ANDROID 4.1下运行的代码: -
String[] command = { "/system/xbin/su", "-c", "/data/mystuff/bin/init.sh" };
Process proc = Runtime.getRuntime().exec(command);
proc.waitFor();
想法是运行Linux初始化脚本。脚本看起来有点像......
#!/system/bin/sh
/data/mystuff/bin/script1 &
/data/mystuff/bin/script2 &
/data/mystuff/bin/script3 &
脚本都是bash脚本,它们永远循环做有趣的事情。但是,当我从adb shell运行“ps”时,我只能看到script1和script3 - script2已经神秘地消失了。
据我所知,如果脚本2写入stdout几次(它有一些“echo”语句来帮助调试),它就会消失(被杀?)。我说这个的原因是因为如果我改变init.sh脚本来做
/data/mystuff/bin/script2 >/dev/null 2>&1 &
然后script2完美无缺。这必须与stdout输出的去向有关。 script2从init.sh继承它的stdout流,而init.sh是从Runtime.getRuntime().exec(command)
获取它的,所以它得到了什么,以及为什么一个进程在写入它几次就会被杀死?
明显的解决方法是放
/exec </dev/null >/dev/null 2>&1
在我的init.sh脚本的顶部,将它和它的子节点从父stdin,stdout和stderr流中分离出来,但我很想知道它为什么会在第一时间出现故障。