«Как запустить одну команду в качестве фонового процесса с помощью su -c

#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.