linuxOS_AP05/external/rkscript/bootanim
2025-06-02 13:59:07 +08:00

90 lines
1.7 KiB
Bash
Executable File

#!/bin/sh
#
# Usage:
# bootanim start [timeout]
# bootanim stop
#
# Example hook:
# root@RK3588:/# more /etc/bootanim.d/gst-bootanim.sh
# #!/bin/sh
# gst-play-1.0 /etc/bootanim.d/bootanim.mp4 -q --no-interactive
SCRIPT=/usr/bin/bootanim
HOOK_DIR=/etc/bootanim.d/
PID_FILE=/tmp/bootanim.pid
LOG_FILE=/tmp/bootanim.log
TIMEOUT=${2:-5}
pid_sid()
{
ps x -o pid,sid | grep -w $@
}
bootanim_start()
{
[ -d $HOOK_DIR ] || return
echo "Starting bootanim: $$..."
# Freeze display server
touch /dev/null $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY
# Start bootanim hooks
for hook in $(find $HOOK_DIR -maxdepth 1 -name "*.sh"); do
echo "Starting hook: $hook..."
$hook&
done
# Save bootanim's pid
echo $$ > $PID_FILE
}
bootanim_stop()
{
[ -f $PID_FILE ] || return
# Parse our sid (same as bootanim's pid)
SID=$(cat $PID_FILE; rm -rf $PID_FILE)
[ -n "$SID" ] || return
# Parse children pid
CPID=$(pid_sid $SID | xargs -n 2 | cut -d' ' -f1 | xargs)
echo "Stopping bootanim: ${CPID:-none} for $SID..."
# Pause children
[ -n "$CPID" ] && kill -STOP $CPID &>/dev/null
# Unfreeze display server
rm -f $XSERVER_FREEZE_DISPLAY $WESTON_FREEZE_DISPLAY
sleep .1
# Kill children
[ -n "$CPID" ] && kill -9 $CPID &>/dev/null
}
case "$1" in
start|"")
# Make sure that we own this session (pid equals sid)
if ! pid_sid -q "$$$" || [ $(realpath "$0") != $SCRIPT ] ; then
setsid $SCRIPT $@
else
# Run it
$SCRIPT stop
bootanim_start 2>&1 | tee -a $LOG_FILE&
# Timeout killer
start-stop-daemon -S -q -b -n bootanim-stop \
-x /bin/sh -- -c "sleep $TIMEOUT; $SCRIPT stop"
fi
;;
stop)
bootanim_stop 2>&1 | tee -a $LOG_FILE
;;
*)
echo "Usage: $0 [start|stop]"
;;
esac
: