【问题标题】:Bash scripting: weird issue when running a background process using su -cBash 脚本:使用 su -c 运行后台进程时出现奇怪的问题
【发布时间】:2011-11-13 22:25:44
【问题描述】:

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

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 退出,程序终止。如果是这种情况,请问我该如何解决?

非常感谢。

【问题讨论】:

    标签: bash unix scripting process


    【解决方案1】:

    此类问题的通常答案是使用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 &
    

    【讨论】:

    • 睡眠时我实际上得到了这个:/data/local/device.conf >/tmp/out 2>/tmp/err /null & && sleep 5'" cannot create /tmp /out: 目录不存在
    • 我更改为 /data/out/ 但知道它不再找到该类 (java.lang.ClassNotFoundException:)。请问是nohup更改了CLASSPATH吗?
    • 由于某种原因它不喜欢 \。现在它可以工作了,但我仍然需要睡眠,否则它不会加载。但它永远有效,即使在睡眠之后:
    • adb shell "su -c ' chmod 666 /dev/graphics/fb0 && export CLASSPATH=/data/local/device.jar && export LD_LIBRARY_PATH=/data/local && exec nohup app_process /system/ bin com.device.client.Main /data/local/device.conf >/data/tmp/out 2>/data/tmp/err /null & && sleep 5'"
    • 对不起,我应该提到我只是放了反斜杠,因为我讨厌这里的水平滚动条——并且要换行一个 shell 命令,你必须转义换行符。如果您将所有内容放在一条线上,请继续忽略该反斜杠。 :) nohup 不应该修改你的环境变量,它只是摆弄HUP(挂断)信号的默认配置。
    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-22
    相关资源
    最近更新 更多