簡體   English   中英

“如何使用 su -c 將單個命令作為后台進程運行

[英]"How to run a single command as a background process using su -c

用手奔跑,

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

它在沒有 & 的情況下工作,但是有了 & 它就不會啟動二進制文件。 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 將在后台運行?

我沒有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

由於這是一個老問題,我只想記錄對特定命令有用的內容,如 shellter 在評論中建議的那樣sleep 30

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

cd /data/local/tmp部分是必要的,因為 nohup 抱怨/不可寫。 重定向到dev/null是必要的,以避免由nohup創建的nohup文件膨脹(因為你想分離,你並不真正關心 stdout)。 我知道sleep不會輸出任何內容,但是這是通過一個將輸出到標准輸出的命令來完成的。

運行后,如果你執行ps -ef | grep sleep ps -ef | grep sleep你會看到兩個進程在運行,其中之一是sush -c cd /data/local/tmp && nohup sleep 30 > /dev/null & 你可以通過 adb 安全地殺死它,只剩下sleep 30

您可以用任何其他命令替換sleep 30 我想您可以改為運行 bash 腳本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM