Выполнение команд

Эта функция позволяет выполнять команды Shell или целые Shell-скрипты на устройстве. Все команды выполняются от имени пользователя, под которым работает данный сервис. Для совместимости с долго выполняющимися скриптами также поддерживаются скрипты, запускаемые в фоновом режиме и не завершающиеся.

Выполнение команд в переднем плане

Вы можете быстро выполнить команду или скрипт следующим образом. Эта операция блокирует текущий процесс, поэтому ваш скрипт или команда не должны выполняться слишком долго; она подходит для коротких скриптов (0–10 секунд).

cmd = d.execute_script("whoami")
>>> d.execute_script("notexist")
exitstatus: 127
stderr: "mksh: <stdin>[2]: notexist: inaccessible or not found\n"

После выполнения команды возвращаются код состояния, стандартный вывод и стандартный вывод ошибок.

print(cmd.stdout)
print(cmd.stderr)
print(cmd.exitstatus)
>>> result = d.execute_script("id")
>>> print(result.stdout)
b'uid=0(root) gid=0(root)\n'
>>> print(result.stderr)
b''
>>> print(result.exitstatus)
0

Выполнение команд в фоновом режиме

Выполнение команд в фоновом режиме подходит для длительно работающих скриптов. Учитывая, что пользователь может написать бесконечный цикл или скрипт, который бесконечно выводит данные и тем самым занимает всю память, получить результат выполнения фонового скрипта невозможно. Если вам нужно получить вывод скрипта, перенаправьте вывод в самом скрипте.

В следующем примере выполняется длительный скрипт sleep и возвращается строка sid, которая служит идентификатором этого фонового скрипта.

script = "sleep 100; exit 0;"
sid = d.execute_background_script(script)

Если со скриптом произойдёт непредвиденная ситуация, вы также можете принудительно завершить выполняющийся в фоне скрипт.

d.kill_background_script(sid)

Используйте sid, чтобы проверить, завершился ли фоновый скрипт.

d.is_background_script_finished(sid)
>>> script = "sleep 100; exit 0;"
>>> sid = d.execute_background_script(script)
>>> print(sid)
ba06da93-c3aa-4457-b90e-247e42a16207
>>> d.is_background_script_finished(sid)
False
>>> d.kill_background_script(sid)
True
>>> d.is_background_script_finished(sid)
True