Скрипт оболочки Android не запускает команду в фоновом режиме

Мое приложение для Android запускает скрипт с помощью Runtime.exec(). Сценарий, в свою очередь, запускает команду, которая запускает процесс. Я хочу записать pid этого процесса, чтобы я мог отслеживать его состояние и позже убить его.

Вот выдержка из моего сценария:

$exec  $options &
echo pid:$!:

Я ожидаю, что пид будет отражен сразу, но это не так. Команда выполняется должным образом, но pid не отображается, пока я вручную не завершу процесс, который был запущен командой. Так что, похоже, не соблюдается запрос на запуск команды в фоновом режиме. Я делаю это неправильно, или Android просто не поддерживает это?

В случае, если это имеет значение, команда ($exec), которую я запускаю, является вызовом двоичного исполняемого файла, а $options расширяется до аргументов для этого исполняемого файла.

1 ответ

Решение

Я делал это неправильно. я имел

Runtime.getRuntime().exec(new String[]{"/path/to/script"}, env);

что хорошо для запуска самого сценария оболочки, так как это не команда оболочки. Но для того, чтобы & в интерпретируемом сценарии оболочки он должен выполняться... ну... в оболочке.

Поэтому мне нужно было вызывать сценарий оболочки так же, как я вызываю команды оболочки напрямую. Как это:

 Runtime.getRuntime().exec(new String[]{"/system/bin/sh", "/path/to/script", scriptArgs...}, env);

С этим кодом и приведенным ниже сценарием двоичный файл выполняется в фоновом режиме, а pid отображается в файле, указанном как аргумент сценария.

$exec $options &
echo $! > "$1"
Другие вопросы по тегам