¿Cómo verificar si el script se ejecuta una vez que se inicia el dispositivo?

Tengo un script que necesito ejecutar una vez, y solo una vez que se inicia el teléfono.

He intentado init.qcom.post_boot.sh, init.sec.boot.sh, debuggerd y finalmente mkshrc

Mientras mi secuencia de comandos se ejecutaba con debuggerd, descubrí que se ejecutaba cada vez que se ejecutaba debuggerd, lo cual no es algo que deba suceder... así que cuando me topé con ( /system/etc/mkshrclos otros 2 simplemente no funcionaron)

Lo que encontré fue que el script se ejecuta una vez, en el arranque... sin embargo, también parece ejecutarse cada vez que se adb shellejecuta, junto con (supongo) cada vez que se inicia el shell... lo cual también es indeseable.

Entonces, ¿qué puedo hacer /system/etc/mkshrcpara asegurarme de que mi llamada a mi script se ejecute solo una vez... en el arranque?

Pensé en ejecutar un whileciclo para verificar getprop sys.boot_completedsi es ==1 y luego volcar un archivo en algún lugar, y a través de una ifdeclaración dentro del ciclo para verificar ese archivo, si existe, salga, si no, ejecute el siguiente comando ... sin embargo, en todas partes Puedo volcar ese archivo, persiste entre arranques, por lo que next commandnunca se vuelve a ejecutar.

NOTA No necesita root para hacer esto, ni mi script necesita root para ejecutarse (sí, lo he confirmado)

CÓDIGO

BB=/system/xbin/busybox
MYPID=/mnt/sdcard/.kev-run

while [ `getprop init.svc.bootanim` == "stopped" ] ; do 
    # if the run file does not exist, and we are stopped
    if [ ! -e $MYPID ]; then
        # run the scripts, then create the run file
        LOG=/mnt/sdcard/Download/kevs-scripts.log
        $BB rm -f $LOG;
        $BB echo "Launching Kevs Scripts" >> $LOG;
        MY_SCRIPT
        # write the run file so we aren't running this everytime this file runs
        touch $MYPID;
        sleep 1;
    fi
done

# if we are still booting, delete the run file
while [ `getprop init.svc.bootanim` != "stopped" ] ; do
    # we're not done booting, remove our makeshift pid file and sleep a second
    $BB rm -f $MYPID;
    sleep 1;
done

Parece estar fuera de mí

Respuestas (1)

mkshrcpor definición, se ejecuta cada vez que se inicia un shell interactivo , por lo que es el lugar equivocado.

En su lugar, debería conectar su secuencia de comandos con el sistema de inicio de Android. (Lo siento, no puedo dar detalles sobre cómo hacerlo; no conozco bien el ecosistema de Android, solo soy el mkshdesarrollador).

Escribir en un archivo tmpfs(para que se elimine automáticamente al apagarlo) suele ser un buen enfoque para que un script se ejecute solo una vez. Sin embargo, me sorprendería si el sistema de inicio de Android no proporcionara tal facilidad; es la herramienta ideal para su trabajo.

sí, noté eso. Me estoy conectando de debuggerdnuevo y utilizando setproppara establecer una "bandera" no persistente ahora
Desearía poder conectarme a init. o incluso compilar un kernel para él (que sería mucho mejor), pero, por desgracia... es un Verizon, con un gestor de arranque bloqueado, así que estoy limitado LOL
Bueno, está esto , pero la respuesta aceptada no funciona en todos los teléfonos, ya que /system/etc/init.d/el soporte es una adición de CM (¿IIRC?). La aplicación de parchesinit.rc parece ser la solución generalmente correcta . En general, service …\n\tdisabled\n\toneshot parece funcionar ; no chmod +xlo olvide y cópielo en la partición correcta de antemano.
Ojalá pudiera. en un G935V, y su cargador de arranque está bloqueado, por lo que root es lo único que realmente tenemos. Terminé utilizando la depuración como mi mecanismo de "disparo", configurando una "bandera" a través de setproppero lo que estoy encontrando ahora, una vez que rootse elimina, setpropya no funciona. Mi objetivo es hacer que algunos ajustes funcionen sin tener que rootear. He confirmado que algunos funcionan, mientras que otros no (lo que se espera), pero el truco es hacer que se disparen al arrancar... una vez :)
Olvidé mencionar que puedo rootear/desrootear mi dispositivo a voluntad. Rooteado, todo funciona bien. Desarraigado, debuggerdarroja un permiso denegado, así que creo que lo que debo hacer es averiguar la propiedad, la política de seguridad y el contexto adecuados para obtener los permisos correctos ... casi allí LOL