当adb被杀死时在设备上运行命令

时间:2019-11-19 16:10:39

标签: android shell process adb signals

我需要通过adb exec-out在android设备上运行一些代码,但是每当主代码完成(包括断开连接的USB,终止的adb等)时,它都需要在设备上执行重要的清除代码。 / p>

我的想法是推动并运行类似的内容:

#!/bin/sh
cleanup() {
  trap - INT TERM HUP PIPE EXIT
  echo "We need to run this!" >> /sdcard/cleanup.log
}
trap cleanup INT TERM HUP PIPE EXIT
echo "Some long running fancy stuff"
sleep 60

当我推动它并通过交互式外壳运行它时,它可以正常工作。 在 CTRL-C 上,它调用cleanup(),但是当我从主机运行它时 adb shell /path/to/script,然后无论我发送到主机adb的任何信号,然后都不会调用设备cleanup()

我希望igb adbd在发生adb连接断开的情况下将SIGHUP发送到设备上的整个进程组。

我目前唯一能想到的解决方案是启动分离的反看门狗那种进程,该进程将保持池化进程并运行清理(如果找不到的话),但这太丑了,我决定要求你们提供一些解决方案建议。

1 个答案:

答案 0 :(得分:0)

我在设备端实现了监视/清理过程,没有池:

WATCH=/data/local/tmp/watch

# Start the watching process on device
adb shell <<EOF!
    mkfifo "${WATCH}"
    (
        exec </dev/null >/dev/null 2>&1
        # Magic here: this will block until main process finishes
        cat "${WATCH}" > /dev/null
        echo "Critical cleanup goes here..."
    ) &
EOF!

# Start the main process and let WATCH-er know if killed
adb exec-out "producer-on-device | tee ${WATCH}" | consumer-on-host

因此,即使我断开USB或kill dash nine adb的连接,它也不是那么丑陋并且可以正常工作。很好玩。