Скрипт оболочки 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"