1 votos

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

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

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

Mientras mi script se ejecutó con debuggerd, descubrí que se ejecutaba cada vez que debuggerd se ejecutaba, lo cual no es algo que necesito que suceda... por lo tanto, cuando me topé con /system/etc/mkshrc (los otros 2 simplemente no funcionaron)

Lo que encontré fue que el script se ejecuta esa única vez, al iniciar... sin embargo, también parece ejecutarse cada vez que se ejecuta adb shell, junto con (asumo) cada vez que se inicia el shell... lo cual tampoco es deseable.

Entonces, ¿qué puedo hacer en /system/etc/mkshrc para asegurarme de que mi llamada a mi script se ejecute solo una vez... al iniciar?

Pensé en ejecutar un bucle while para verificar la getprop sys.boot_completed si es == 1 entonces guardar un archivo en algún lugar, y mediante una afirmación if dentro del bucle para verificar ese archivo, si existe entonces salir, si no, ejecutar el siguiente comando... sin embargo, en todos los lugares donde puedo guardar ese archivo, persiste entre arranques, por lo que el siguiente comando nunca se ejecuta de nuevo.

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

CODIGO

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

while [ `getprop init.svc.bootanim` == "stopped" ] ; do 
    # si el archivo de ejecución no existe, y estamos detenidos
    if [ ! -e $MYPID ]; then
        # ejecutar los scripts, luego crear el archivo de ejecución
        LOG=/mnt/sdcard/Download/kevs-scripts.log
        $BB rm -f $LOG;
        $BB echo "Lanzando Scripts de Kev" >> $LOG;
        MI_SCRIPT
        # escribir el archivo de ejecución para que no estemos ejecutando esto cada vez que se ejecuta este archivo
        touch $MYPID;
        sleep 1;
    fi
done

# si todavía se está iniciando, eliminar el archivo de ejecución
while [ `getprop init.svc.bootanim` != "stopped" ] ; do
    # no hemos terminado de iniciar, eliminar nuestro archivo de identificación provisional y dormir un segundo
    $BB rm -f $MYPID;
    sleep 1;
done

Me parece que algo está mal

1voto

mirabilos Puntos 165

mkshrc se ejecuta por definición cada vez que se inicia un shell interactivo, por lo que no es el lugar correcto.

Realmente deberías vincular tu script con el sistema init de Android en su lugar. (Lo siento, no puedo dar detalles sobre cómo hacerlo; no conozco bien el ecosistema de Android, solo soy el desarrollador de mksh).

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

0 votos

Sí, noté eso. Me estoy conectando de nuevo a debuggerd, y utilizando setprop para establecer ahora una "bandera" no persistente.

0 votos

Me gustaría poder engancharme en init. o incluso compilar un kernel para ello (lo cual sería mucho mejor), pero lamentablemente... es un Verizon, con un bootloader bloqueado, así que estoy limitado LOL

0 votos

Bueno, hay esto pero la respuesta aceptada no funciona en todos los teléfonos ya que el soporte /system/etc/init.d/ es una adición de CM (si mal no recuerdo). Parchear init.rc parece ser la solución generalmente correcta. En general, service …\n\tdisabled\n\toneshot parece funcionar; no olvides hacerle chmod +x y copiarlo a la partición correcta de antemano.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X