我需要通过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发送到设备上的整个进程组。
我目前唯一能想到的解决方案是启动分离的反看门狗那种进程,该进程将保持池化进程并运行清理(如果找不到的话),但这太丑了,我决定要求你们提供一些解决方案建议。
答案 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的连接,它也不是那么丑陋并且可以正常工作。很好玩。