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/mkshrc
los 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 shell
ejecuta, junto con (supongo) cada vez que se inicia el shell... lo cual también es indeseable.
Entonces, ¿qué puedo hacer /system/etc/mkshrc
para asegurarme de que mi llamada a mi script se ejecute solo una vez... en el arranque?
Pensé en ejecutar un while
ciclo para verificar getprop sys.boot_completed
si es ==
1 y luego volcar un archivo en algún lugar, y a través de una if
declaració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 command
nunca 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í
mkshrc
por 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 mksh
desarrollador).
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.
Kevin
debuggerd
nuevo y utilizandosetprop
para establecer una "bandera" no persistente ahoraKevin
Mirabilios
/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 ; nochmod +x
lo olvide y cópielo en la partición correcta de antemano.Kevin
setprop
pero lo que estoy encontrando ahora, una vez queroot
se elimina,setprop
ya 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 :)Kevin
debuggerd
arroja 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