【问题标题】:run command on device when adb killed当 adb 被杀死时在设备上运行命令
【发布时间】:2019-11-19 16:10:39
【问题描述】:

我需要通过adb exec-out在android设备上运行一些代码,但是当主要代码完成时(包括断开的USB、杀死的adb等),它也需要在设备上执行一个重要的清理代码。

我的想法是推送并运行类似的东西:

#!/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

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

我期待 adbd 在 adb 连接断开的情况下向设备上的整个进程组发送 SIGHUP。

目前我能想到的唯一解决方案是启动separatce anti-watchdog 类型的进程,该进程将保持池化进程并在未找到时运行清理,但这太丑陋了,我决定向你们询问一些建议。

【问题讨论】:

    标签: android shell process adb signals


    【解决方案1】:

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

    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 也能正常工作。很有趣。

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      相关资源
      最近更新 更多