¿Cómo ejecutar un ejecutable en el arranque y mantenerlo funcionando? -- root-access campo con linux campo con scripts campo con services campo con init.d camp android Relacionados El problema

How to run an executable on boot and keep it running?


3
vote

problema

Español

Tengo una construcción ejecutable de un programa ndk-build . Quiero ejecutarlo en un dispositivo Android enraizado. ¿Cuánto cuesta la posibilidad de que Android matará a mi ejecutable?

usando adb shell , soy capaz de ejecutar mi ejecutable usando los siguientes comandos:

  adb push executable /sdcard adb shell device:/ $ su device:/ # cd /system device:/system # mount -o rw,remount /system device:/system # mv /sdcard/executable . device:/system # ./executable   

Mi requisito es ejecutar este ejecutable en el inicio del dispositivo.

He intentado seguir:

  1. escribe ./executable en init.rc .
    • En Reiniciar ABCDEFGHIJKLMNABCDEFGHIJKLMN5 Restablecer a sus contenidos originales. Me di cuenta de que Magisk hizo esto.
  2. escribe comandos en /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ABCDEFGHIJKLMNABCDEFGHIJKLMN9

Ninguna de las cosas anteriores está funcionando.

Original en ingles

I have an executable build from a ndk-build program. I want to run it on a rooted Android device. How much is the possibility that Android will kill my executable?

Using adb shell, I am able to execute my executable using following commands:

adb push executable /sdcard adb shell device:/ $ su device:/ # cd /system device:/system # mount -o rw,remount /system device:/system # mv /sdcard/executable . device:/system # ./executable 

My requirement is to run this executable on device boot.

I have tried following:

  1. Write ./executable in init.rc.
    • On reboot init.rc reset to its original contents. I figured out that Magisk done this.
  2. Write commands in /system/etc/init/bootstat.rc
    • ./executable
    • service custom /system/executable
    • on boot ./system/dhandler/diag_revealer

None of the above thing is working.

              
 
 

Lista de respuestas

6
 
vote
vote
La mejor respuesta
 

¿Cuánto cuesta la posibilidad de que Android matará a mi ejecutable?

Los procesos nativos privilegiados generalmente no son asesinados por Android, excepto si no pueden manejar un error en el interior, como algún recurso del sistema, no disponible o permiso denegado debido a SELinux, etc. para liberar la memoria, Android solo mata procesos dentro de su marco, es decir, ejecutándose bajo zygote . Para administrar los recursos para procesos nativos, Android usa cgroups .

Los procesos se matan cuando reciben señales del kernel u otros programas de espacio de usuario (por ejemplo, con kill ^ {© código> ( 1 , 2 ) . El kernel es el sistema operativo real, no visible para nosotros, sino que manejamos todo lo que hacemos con el dispositivo. Un desarrollador puede programar su código cómo reaccionar a una señal específica si se recibe, o ignóralo por completo (> 3 ) . Excepto sigkill . Lo que no puede ser manejado por el programa, no se advierte del núcleo, sin un período de gracia para salir de forma segura, simplemente terminada de inmediato. Pero el kernel no le importará su presencia a menos que él se sienta corto en recursos de hardware o comience a estar mal. Es por eso que la programación es importante.

Los programas pueden enviarnos mutuamente (incluyendo KILL), que se reenvían por el kernel, gobernado por UID ( 4 ) . Sin embargo, ABCDEFGHIJKLMNABCDEFGHIJKLMN3 El primer proceso en el espacio de usuario iniciado por el kernel es el querido, el kernel nunca reenvía peligrosos señales a init . Y si esto sucede por alguna razón, el kernel se pone pánico y se reinicia ( 5 ) .

Resumiendo las líneas anteriores, es posible evitar ser asesinado (AMAP) programáticamente o usando algunos Trucos de scripts < / a> como @ alecxs ha mencionado. Pero si desea asegurarse de que su proceso se reinicie si se mata, defina un servicio de Android <> ABCDEFGHIJKLMNABCDEFGHIJKLMN5 .

En Reiniciar ABCDEFGHIJKLMNABCDEFGHIJKLMN6 Restablecer a sus contenidos originales. Me di cuenta de que Magisk hizo esto.

No, Magisk no hizo esto. El ABCDEFGHIJKLMNABCDEFGHIJKLMN7 es un sistema de archivos temporal (no es una persistente como en /system o abcdefhijklmnabcdefghijklmn9 ) que se borra en cada reinicio. Contenido del directorio raíz ( cgroups0 ) se extraen de otra partición llamada cgroups1 que contiene cgroups2 y abcdefhijklmnabcdefghijklmn13 (aunque las cosas Han cambiado con sistema-as-root ). Por lo que no puede cambiar cgroups4 permanentemente a menos que extraiga, modifique, vuelva a máquina y reflejar cgroups5 .

Pero para definir un nuevo servicio init, modificar cgroups6 no es necesario. Android analiza todo cgroups7 Archivos de cgroups8 Directorios ubicados en cgroups9 y abcdefhijklmnabcdefhijklmn20 ( 6 ) . Para que pueda crear su propio archivo kill1 .


Nota: Para obtener privilegios de raíces reales y tratar con SELINUX, todas las opciones que se indican a continuación dependen de MAGISH. Consulte esta respuesta para más detalles.

init.d script

Puede usar la característica tradicional kill2 , como de Magisk para iniciar un proceso en el arranque. Crear script kill3 :

  kill4 / Código> 

* kill5 es Shell's pseudo-señal .
* El ABCDEFGHIJKLMNABCDEFGHIJKLMN26 (de kill7 ) es buggy, mejor uso kill8 applet.

Coloque el ejecutable en ABCDEFGHIJKLMNABCDEFGHIJKLMN29 y configure permisos:

  init0  

También puede colocar la secuencia de comandos en init1 , pero eso se ejecuta un poco antes. Asegúrese de que las rutas de sistema de archivos (y otros recursos requeridos si corresponde) están disponibles en esa etapa.

Ejecutar programa de init

Otra forma es ejecutar directamente el binario de Init. Crear init2 Archivo:

  init3  

Permisos establecidos:

  init4  

¡Y eso es todo! Reinicie el dispositivo para que los cambios surtan efecto.

Sin embargo, es una ejecución de una sola vez, no se reiniciará. También hay algunas características de scripting de shell que no están disponibles en init5 Archivos. Por ejemplo, no puede redirigir stdout / stderr a un archivo, esto debe ser manejado por el programa ejecutable. Para que podamos tratar de hacer uso de ambos; script shell y init6 Archivo:

Servicio de Init

En lugar de ejecutar directamente binario de init7 Archivo, ejecute un script Shell. Crear script init8 :

  ABCDEFGHIJKLMNABCDEFGHIJKLMN39   

Crear init0 Service:

  init1  

Configurar permisos en init2 , init3 y abcdefhijklmnabcdefghijklmn44 tal como se indica anteriormente y reiniciando.

Otros parámetros ( 7 ) como init5 , abcdefhijklmnabcdefghijklmn46 , abcdefghijklmninit7 Si desea ejecutar el servicio como no privilegiado usuario. Concesión Los privilegios menos requeridos es el enfoque recomendado por la perspectiva de seguridad. Consulte esta respuesta Para obtener más detalles sobre capacidades y selinux.

ABCDEFGHIJKLMNABCDEFGHIJKLMN48 se mantendrá en el servicio de reinicio cada 5 segundos (por defecto) si se mata. Puede detener el servicio con init9 . Reemplace init0 con init1 para comenzar de nuevo.
Para ver qué pasa con el servicio: ABCDEFGHIJKLMNABCDEFGHIJKLMN52 .

relacionado :

  • ¿Cómo ejecutar un servicio de inicio de Android con SuperUSER SELINUX CONTEXTO?
  • ¿Cómo ejecutar un script en el fondo de ADB Shell?

 

How much is the possibility that Android will kill my executable?

Privileged native processes usually don't get killed by Android except if they can't handle an error occurred inside, such as some system resource not available or permission denied because of SELinux etc. To free up memory, Android only kills processes within its framework i.e. running under zygote. To manage resources for native processes, Android uses cgroups.

Processes are killed when they receive SIGNALS from kernel or other userspace programs (e.g. with kill command) (1, 2). Kernel is the actual operating system, not visible to us but handling everything we do with device. A developer can program his code how to react to a specific signal if received, or completely ignore it (3). Except SIGKILL. Which can't be handled by program, no warning from kernel, no grace period to exit safely, just being terminated immediately. But kernel won't mind your presence unless he gets short on hardware resources or you start misbehaving. That's why programming is important.

Programs can send each other signals (including KILL), which are forwarded by kernel, governed by UID (4). However, init the very first process in userspace started by kernel is the dear one, kernel never forwards dangerous signals to init. And if this happens for some reason, kernel gets panic and reboots (5).

Summarizing above lines, it is possible to avoid being killed (AMAP) programmatically or using some scripting tricks as @alecxs has mentioned. But if you want to make sure that your process should restart if gets killed, define an Android init service.

On reboot init.rc reset to its original contents. I figured out that Magisk done this.

No, Magisk didn't do this. Android's rootfs is a temporary filesystem (not a persistent one like on /system or /data) that gets cleared on every reboot. Contents of root directory (/) are extracted from another partition named boot which contains kernel and ramdisk (though things have changed with system-as-root). So you can't change init.rc permanently unless you extract, modify, repack and reflash boot.img.

But to define a new init service, modifying init.rc isn't necessary. Android parses all .rc files from /etc/init directories located under /system and /vendor (6). So you can create your own .rc file.


NOTE: In order to get real root privileges and to deal with SELinux, all of the options given below depend on Magisk. See this answer for details.

INIT.D SCRIPT

You can use traditional init.d-like feature of Magisk to start a process on boot. Create script /data/adb/service.d/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # run script in background to avoid blocking boot chain [ -n "$BG" ] || { BG=Y "$0" & exit; }  # try to ignore signals as much as possible for i in $(seq 64); do trap '' "$i"; done  # execute script whenever exits e.g. when executable gets killed trap "sleep 5; exec $0" EXIT  # avoid multiple instances e.g. if script killed but executable is running pkill -9 -x /system/bin/executable  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." /system/bin/executable  # program is killed, won't reach here if script is killed echo "$(date): Re-executing script..." 

* EXIT is shell's pseudo-signal.
* Android's /system/bin/pkill (from toybox) is buggy, better use busybox applet.

Place the executable under /system/bin and set permissions:

~# chown 0.0 /system/bin/executable /data/adb/service.d/custom.sh ~# chmod 0755 /system/bin/executable /data/adb/service.d/custom.sh 

You can also place script under /data/adb/post-fs-data.d/ but that's executed a bit earlier. Be sure that filesystem paths (and other required resources if any) are available at that stage.

EXECUTE PROGRAM FROM INIT

Another way is to directly execute the binary from init. Create custom.rc file:

#/etc/init/custom.rc  # execute the binary when boot is completed on property:sys.boot_completed=1     exec_background u:r:magisk:s0 -- /system/bin/executable 

Set permissions:

~# chown 0.0 /etc/init/custom.rc ~# chmod 0644 /etc/init/custom.rc ~# chcon u:object_r:system_file:s0 /etc/init/custom.rc 

And that's all! Restart device for changes to take effect.

However it's a one time execution, won't be restarted. Also there are some shell scripting features not available in .rc files. For instance you can't redirect stdout/stderr to a file, this has to be handled by executable program itself. So we can try to make use of both; shell script and .rc file:

INIT SERVICE

Instead of directly executing binary from .rc file, execute a shell script. Create script /system/bin/custom.sh:

#!/system/bin/sh  # write log file if executable throws something at stdout/sterr exec >>/data/media/0/executable.log 2>&1  # execute the binary, should run in foreground, otherwise get in loop echo "$(date): Starting program..." exec /system/bin/executable 

Create init service:

#/etc/init/custom.rc  # define service, use executable here if script not needed service custom /system/bin/custom.sh      # don't start unless explicitly asked to     disabled      # only execute once, don't restart if exited     # don't add if you want to restart service when killed     #oneshot      # run with unrestricted SELinux context to avoid avc denials     # it's required if SELinux is enforcing and service needs access     # to some system resources not allowed by default sepolicy     seclabel u:r:magisk:s0  # start the service when boot is completed on property:sys.boot_completed=1     start custom 

Set permissions on executable, custom.sh and custom.rc as stated above and restart.

Other parameters (7) such as user, group, capabilities are required if you want to run the service as non-privileged user. Granting least required privileges is the recommended approach from security's perspective. See this answer for more details on capabilities and SELinux.

init will keep on restarting service every 5 seconds (by-default) if it gets killed. You can stop the service with setprop ctl.stop custom. Replace stop with start to start again.
To see what happens with service: dmesg | grep init: | tail.

RELATED:

  • How to run an Android init service with superuser SELinux context?
  • How to run a script in background from adb shell?
 
 
 
 

Relacionados problema

4  IFUP / IFDOWN Scripts  ( Ifup ifdown scripts ) 
Estoy fiddeling con algunas cosas relacionadas con la red y quiero probarlos en Android también. En Ubuntu fue bastante fácil ejecutar algunos comandos si una...

0  Link2SD Mount Script Error. [4]: No se puede crear /System/ETC/init.d/11link2SD:> No es un directorio  ( Link2sd mount script error 4 cant create system etc init d 11link2sd no ) 
Quiero mover algunas de mis aplicaciones de mi memoria interna a mi ExtsdCard. Seguí este para hacerlo (no estoy usando Marsh Mellow, así que salte la prime...

0  Retire el script en init.d  ( Remove the script in init d ) 
Quiero flashear Tweakdrypt a mi dispositivo Android 4.4.2 enraizado. Pero antes, debo eliminar todos los scripts en init.d. He intentado usar Universal init.d...

0  En un acceso a terminal de la aplicación Termux, ¿a dónde debo poner mi propio servicio de ejecución para iniciar el reinicio del teléfono?  ( On a termux app terminal access where should i put my own runnit service to star ) 
Escribí un simple servicio como este: http://smarden.org/runit/ runscripts.html # apache2 $ cat start_node_exporter #!/data/data/com.termux/files/usr/bi...

1  ¿Cómo limpiar la memoria caché de la aplicación usando script cada vez que el teléfono arranque?  ( How to clean app cache using script every time the phone boot ) 
Sé que hay muchas aplicaciones que limpian el caché cada bota, pero me gustaría usar init.d / script para guardar almacenamiento. Dalvik-cache es / Data / D...

0  Servicio de inicio que no se inicia en la construcción del usuario  ( Init service not starting in user build ) 
Tengo un servicio de inicio que no está comenzando en la construcción de usuarios. Cuando se ejecuta una construcción de userdebug, funciona bien, pero no en ...

1  init.rc no inicia mi servicio en el evento de inicio completado  ( Init rc doesnt start my service on boot completed event ) 
He agregado el siguiente fragmento al final del archivo /system/core/rootdir/init.rc . on property:dev.bootcomplete=1 start bootcomplete_handler serv...

2  Monte en /data/local/userinit.sh no está funcionando  ( Mount in data local userinit sh is not working ) 
Quiero MAP / SDCARD / DCIM A / Storage / SDCard1 / DCIM utilizando CM 12.1 en un I9100 Escribí esas pocas líneas a ABCDEFGHIJKLMNABCDEFGHIJKLMN0 : #!/sy...

1  ¿Cómo ejecutar un servicio de inicio de Android con el contexto SELINUX SUPERUSER?  ( How to run an android init service with superuser selinux context ) 
Quiero ejecutar un servicio de Android init . Tengo un dispositivo que tiene cáscara arraigada (comprada de la fabricación como arraigada). Este dispositivo ...

4  ¿Cómo crear scripts de inicio usando la carpeta init.d?  ( How to create start up scripts using the init d folder ) 
en esta respuesta a una pregunta que le pregunté hace un tiempo, dijo que es posible tener un script ejecutado cada bota. He creado un archivo (sin extens...

0  ¿Es posible iniciar un bucle infinito dentro de init.d?  ( Is it possible to start an infinite loop within init d ) 
Me gustaría crear un script init.d para controlar el fan de mi ODROID XU3 en Lollipop 5.1.1, CyanogenMod 12.1. Ya realizo uno en Linux que está funcionando ...

1  Bloquee el acceso a Internet antes de que comience el firewall en el arranque  ( Block internet access before firewall starts at boot ) 
Tengo un antiguo teléfono Android con helado Sandwich y Droidwall como firewall, lo que se asegura de que las aplicaciones no puedan usar el 3G a menos que lo...

3  ¿Cómo ejecutar un ejecutable en el arranque y mantenerlo funcionando?  ( How to run an executable on boot and keep it running ) 
Tengo una construcción ejecutable de un programa ndk-build . Quiero ejecutarlo en un dispositivo Android enraizado. ¿Cuánto cuesta la posibilidad de que Andr...

2  ¿Cómo hacer que las reglas inyectadas SELINUX sean persistentes sin desembalar: empaquetando boot.img?  ( How to make selinux injected rules persistent without unpacking packing boot img ) 
Estoy trabajando en una aplicación que necesita acceso de raíz y tengo un dispositivo que está arraigado pero no con MAGISH. Este dispositivo tiene solo ABCD...

-1  Parece que mi dispositivo no tiene soporte init.d, pero tengo un montón de archivos. * Archivos. ¿Puedo usar el mismo enfoque de alguna manera?  ( It seems my device doesnt have init d support but i have a bunch of init fil ) 
-rwxr-x--- 1 root root 3265 Jan 1 1970 init.class_main.sh -rwxr-x--- 1 root root 1730 Jan 1 1970 init.mdm.sh -rwxr-x--- ...

2  ¿Cómo se cambian los valores de CAN / PROC / SYS en el arranque (SYSCTL.CONF hace esto en Linuxes Normal)?  ( How can proc sys values be changed at boot sysctl conf does this on normal lin ) 
¿Cómo puede abcdefghijklmn/proc/sys valores en el arranque? ABCDEFGHIJKLMNABCDEFGHIJKLMN3 no existe en Android y los valores de eco en el proc Files n...

1  ¿Por qué no puedo eliminar el directorio usando MV?  ( Why i cant remove directory using mv ) 
Así que quiero usar bindfs que requieren que el directorio montado esté vacío. Luego estoy tratando de mover el contenido de WhatsApp (almacenamiento intern...

0  ¿Cómo puedo ejecutar un script personalizado en cada startup (sin asistencia nativa init.d)?  ( How can i run a custom sh script at each startup without native init d support ) 
Esto parece una preocupación general de los jugadores del sistema de Android Rookie que acaba de arraigar sus teléfonos. El método más prevalente puede estar ...

2  No se puede instalar APK usando la aplicación SH Script y init.d  ( Cant install apk using sh script and init d app ) 
Estoy tratando de instalar APK cuando el dispositivo está arrancando. Escribí script shell para instalar APK: #!/system/bin/sh pm install /data/local/tmp/M...

0  Init.d scripts no ejecutados  ( Init d scripts not executed ) 
Yo uso un viejo Samsumg J120W ejecutando Android 6.0.1 que parece no venir con init.d. He instalado init.d usando el apoyo de init.d universal de Ruyinferno. ...

2  Selinux evita mi comando init.rc ejecutivo para ejecutar  ( Selinux prevents my init rc exec command to execute ) 
Añadido un comando exec al final de init.rc Archivo. on property:dev.bootcomplete=1 exec u:r:shell:s0 shell shell -- /system/bin/am start -n com.ex...

0  Init.d script no funcionará para mantener el valor  ( Init d script wont work to keep value ) 
Intentaría cambiar algún valor como VM, LowMemorykiller, adj y net usando shell script, luego guárdelo en la carpeta init.d y ejecutela como root. Después d...

1  Añadiendo script de arranque personalizado a Android-x86 Nougat  ( Adding custom bootup script to android x86 nougat ) 
He estado feliz usando Android-X86 Turrón en mi sistema. Gracias a todos los que hicieron ese trabajo. Ahora estoy tratando de hacer un pequeño cambio que es ...

3  init.d no se ejecuta  ( Init d doesnt get executed ) 
Estoy usando Samsung S2 y una ROM personalizada, la tarjeta SD externa está montada en / EMMC, pero quiero que se monte en / MNT / SDCard / External_SD, ¿cómo...

1  Automount EXT2 SD-Tarjeta en Huawei U8350 (Android 2.2.2)  ( Automount ext2 sd card on huawei u8350 android 2 2 2 ) 
En el Huawei U8350 (Android 2.2.2), todos los scripts de inicio parecen estar en la partición raíz, que en realidad es un disco de RAM (initRAMFS), por lo que...

Relacionados problema

4  IFUP / IFDOWN Scripts 
0  Link2SD Mount Script Error. [4]: No se puede crear /System/ETC/init.d/11link2SD:> No es un directorio 
0  Retire el script en init.d 
0  En un acceso a terminal de la aplicación Termux, ¿a dónde debo poner mi propio servicio de ejecución para iniciar el reinicio del teléfono? 
1  ¿Cómo limpiar la memoria caché de la aplicación usando script cada vez que el teléfono arranque? 
0  Servicio de inicio que no se inicia en la construcción del usuario 
1  init.rc no inicia mi servicio en el evento de inicio completado 
2  Monte en /data/local/userinit.sh no está funcionando 
1  ¿Cómo ejecutar un servicio de inicio de Android con el contexto SELINUX SUPERUSER? 
4  ¿Cómo crear scripts de inicio usando la carpeta init.d? 
0  ¿Es posible iniciar un bucle infinito dentro de init.d? 
1  Bloquee el acceso a Internet antes de que comience el firewall en el arranque 
3  ¿Cómo ejecutar un ejecutable en el arranque y mantenerlo funcionando? 
2  ¿Cómo hacer que las reglas inyectadas SELINUX sean persistentes sin desembalar: empaquetando boot.img? 
-1  Parece que mi dispositivo no tiene soporte init.d, pero tengo un montón de archivos. * Archivos. ¿Puedo usar el mismo enfoque de alguna manera? 
2  ¿Cómo se cambian los valores de CAN / PROC / SYS en el arranque (SYSCTL.CONF hace esto en Linuxes Normal)? 
1  ¿Por qué no puedo eliminar el directorio usando MV? 
0  ¿Cómo puedo ejecutar un script personalizado en cada startup (sin asistencia nativa init.d)? 
2  No se puede instalar APK usando la aplicación SH Script y init.d 
0  Init.d scripts no ejecutados 
2  Selinux evita mi comando init.rc ejecutivo para ejecutar 
0  Init.d script no funcionará para mantener el valor 
1  Añadiendo script de arranque personalizado a Android-x86 Nougat 
3  init.d no se ejecuta 
1  Automount EXT2 SD-Tarjeta en Huawei U8350 (Android 2.2.2) 



© 2021 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos