#bash #shell #unix #adb
#bash #оболочка #unix #adb
Вопрос:
Запуск вручную,
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 amp;
Выполняется, как ожидалось.
Однако попытка запустить это из скрипта bash с использованием следующей команды работает не так, как ожидалось.
adb shell "su -c '
chmod 666 /dev/graphics/fb0
amp;amp; export CLASSPATH=/data/local/device.jar
amp;amp; export LD_LIBRARY_PATH=/data/local
amp;amp; exec app_process /system/bin com.device.client.Main /data/local/device.conf amp;'"
Это работает без amp; , но с amp; это просто не запустит двоичный файл. exec app_process должен быть фоновым процессом.
Возможно, что оболочка выполняет двоичный файл, но затем просто умирает, потому что больше ничего не ожидает, но я не знаю, как это исправить. Это должно сделать превращение su в фоновый процесс «amp;», но это не сработало.
При запуске без amp; мы получаем:
D/su ( 1728): 0 /system/bin/sh executing 0
D/su ( 1728): chmod 666 /dev/graphics/fb0
D/su ( 1728): amp;amp; export CLASSPATH=/data/local/device.jar
D/su ( 1728): amp;amp; export LD_LIBRARY_PATH=/data/local
D/su ( 1728): amp;amp; exec app_process /system/bin com.device.client.Main /data/local/device.conf using shell /system/bin/sh : sh
При добавлении amp; мы получаем:
D/su ( 1746): 0 /system/bin/sh executing 0
D/su ( 1746): chmod 666 /dev/graphics/fb0
D/su ( 1746): amp;amp; export CLASSPATH=/data/local/device.jar
D/su ( 1746): amp;amp; export LD_LIBRARY_PATH=/data/local
D/su ( 1746): amp;amp; exec app_process /system/bin com.device.client.Main /data/local/device.conf amp; using shell /system/bin/sh : sh
но ничего не загружается!
Как я могу запустить свой набор команд, гарантируя, что app_process будет выполняться в фоновом режиме?
Комментарии:
1. проведите тест с гораздо более простой программой для запуска в фоновом режиме, скажем
sleep 30
? Тогда, если нет проблем, это что-то о вашем app_process. Вы говорите «ничего не загружается», но можете ли вы сказать, запускается ли app_process когда-либо, выполняется ли он все еще? Это зависает? (возможно, ожидает ввода?) Посмотрите сps -ef | grep app_process
. Удачи.2. Это не само приложение. Вы можете сказать, что когда она загружается с помощью: »
D/dalvikvm( 1666): DexOpt: load 2593ms, verify 205ms, opt 22ms ... D/dalvikvm( 1659): No JNI_OnLoad found in /data/local/libhostConnection.so 0x40020b78, skipping init
» , этого не происходит при использовании amp; . У него есть время (true), поэтому он будет выполняться постоянно и не будет отображаться в ps. Похоже, что это даже не запускается.
Ответ №1:
У меня нет 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 amp;
END_BASH
Комментарии:
1.
adb
расшифровывается как Android Debugger Bridge , а не advanced debugger, как вы думаете! Просто к вашему сведению 🙂
Ответ №2:
Поскольку это старый вопрос, я хотел бы просто задокументировать, что сработало у меня для конкретной команды, sleep 30
как предложено в комментарии shellter:
adb shell "su -c 'cd /data/local/tmp amp;amp; nohup sleep 30 > /dev/null amp;'"
cd /data/local/tmp
Часть необходима, потому что nohup жалуется, что /
невозможно записать.
Перенаправление на dev/null
необходимо, чтобы избежать раздувания nohup
файла, созданного nohup
(поскольку вы хотите отсоединиться, вам на самом деле наплевать на стандартный вывод). Я знаю, что sleep
это ничего не выводит, но это делается с помощью команды, которая выполняет вывод в стандартный вывод.
После запуска этого, если вы это сделаете ps -ef | grep sleep
, вы увидите, что запущены два процесса, один из них sush -c cd /data/local/tmp amp;amp; nohup sleep 30 > /dev/null amp;
. Вы можете безопасно отключить ее через adb, и останется только sleep 30
.
Вы можете заменить sleep 30
любую другую команду. Я думаю, вы могли бы вместо этого запустить свой скрипт bash.