From a9475f6320dc029af99487f2cff6f8fbd630364e Mon Sep 17 00:00:00 2001 From: hyx Date: Wed, 1 Apr 2026 10:36:19 +0800 Subject: [PATCH] add e_player crash recovery --- .../rootfs_overlay/bin/e_player_wrapper | 100 ++++++++++++++++++ .../demo_ld/rootfs_overlay/etc/inittab | 1 + 2 files changed, 101 insertions(+) create mode 100755 sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/bin/e_player_wrapper diff --git a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/bin/e_player_wrapper b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/bin/e_player_wrapper new file mode 100755 index 000000000..48e917abb --- /dev/null +++ b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/bin/e_player_wrapper @@ -0,0 +1,100 @@ +#!/bin/sh +# e_player 崩溃监控和恢复脚本 + +CRASH_COUNT_FILE="/data/.e_player_crash_count" +STABLE_COUNT_FILE="/data/.e_player_stable_count" +MAX_CRASH=5 +CHECK_INTERVAL=1 +STABLE_CHECKS=120 # 连续检测120s 进程存在才认为稳定 + +if [ ! -f "$CRASH_COUNT_FILE" ]; then + echo 0 > "$CRASH_COUNT_FILE" +fi +if [ ! -f "$STABLE_COUNT_FILE" ]; then + echo 0 > "$STABLE_COUNT_FILE" +fi + +echo "$(date): e_player_wrapper starting, waiting for e_player..." >> /data/crash.log +WAIT_COUNT=0 +while [ $WAIT_COUNT -lt 20 ]; do + if ps | grep -v grep | grep -v e_player_wrapper | grep e_player > /dev/null; then + echo "$(date): e_player detected after ${WAIT_COUNT} checks, starting monitoring..." >> /data/crash.log + break + fi + sleep 3 + WAIT_COUNT=$((WAIT_COUNT + 1)) +done + +if ! ps | grep -v grep | grep -v e_player_wrapper | grep e_player > /dev/null; then + echo "$(date): WARNING - e_player not found after 60s, will monitor anyway..." >> /data/crash.log +fi + +echo "$(date): Starting main monitoring loop..." >> /data/crash.log + +HEARTBEAT=0 +while true; do + HEARTBEAT=$((HEARTBEAT + 1)) + if [ $HEARTBEAT -ge 120 ]; then + echo "$(date): [Heartbeat] Monitoring active, stable_count=$(cat $STABLE_COUNT_FILE)" >> /data/crash.log + HEARTBEAT=0 + fi + + if ! ps | grep -v grep | grep -v e_player_wrapper | grep e_player > /dev/null; then + # 进程不存在,崩溃了 + echo 0 > "$STABLE_COUNT_FILE" # 重置稳定计数 + + COUNT=$(cat "$CRASH_COUNT_FILE") + COUNT=$((COUNT + 1)) + echo $COUNT > "$CRASH_COUNT_FILE" + + echo "$(date): e_player crashed, count: $COUNT" >> /data/crash.log + + if [ $COUNT -ge $MAX_CRASH ]; then + echo "$(date): Crash count exceeded $MAX_CRASH, restoring from factory..." >> /data/crash.log + + # 从factory恢复文件 + if [ -f /system/factory/e_player ]; then + cp /system/factory/e_player /data/e_player + chmod +x /data/e_player + echo "$(date): Restored e_player from factory" >> /data/crash.log + fi + + if [ -f /system/factory/lbh_client ]; then + cp /system/factory/lbh_client /data/lbh_client + chmod +x /data/lbh_client + echo "$(date): Restored lbh_client from factory" >> /data/crash.log + fi + + # 重置崩溃计数,重新开始 + echo 0 > "$CRASH_COUNT_FILE" + echo "$(date): Reset crash count, retrying..." >> /data/crash.log + fi + + echo "$(date): Restarting e_player..." >> /data/crash.log + killall -9 e_player 2>/dev/null + sleep 1 + + export LD_LIBRARY_PATH=/data/bin/libs:/vendor/qua/lib:/lib:/usr/lib:$LD_LIBRARY_PATH + cd /data + /data/e_player & + sleep 3 + else + # 进程存在,累加稳定计数 + STABLE=$(cat "$STABLE_COUNT_FILE") + STABLE=$((STABLE + 1)) + echo $STABLE > "$STABLE_COUNT_FILE" + + # 如果稳定运行120秒,重置崩溃计数 + if [ $STABLE -ge $STABLE_CHECKS ]; then + COUNT=$(cat "$CRASH_COUNT_FILE") + if [ $COUNT -gt 0 ]; then + echo "$(date): e_player stable, resetting crash count" >> /data/crash.log + echo 0 > "$CRASH_COUNT_FILE" + fi + echo 0 > "$STABLE_COUNT_FILE" # 重置稳定计数,下次再累计 + fi + fi + + sleep $CHECK_INTERVAL +done + diff --git a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/inittab b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/inittab index d3ff5562a..2a5536740 100755 --- a/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/inittab +++ b/sdk/X-AIOS-LT00-V1.0.4/product/demo_ld/rootfs_overlay/etc/inittab @@ -1,4 +1,5 @@ ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::restart:/sbin/init +::respawn:/bin/e_player_wrapper #::respawn:-/bin/daemon