![]() |
|
| Tasker Para hablar de todo lo relacionado con la aplicación tasker |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
|
Introducción a los comandos de terminal en Tasker
Hola a todos!
En este tutorial voy a tratar de explicar un poco los conceptos básicos de los comandos de terminal en Android y como lanzarlos y aprovecharlos en Tasker. Nota: los conceptos de este tutorial son bastante avanzados, aunque voy a tratar de explicarlo de forma sencilla. En principio los comandos ejecutados como usuario normal no deberían ser capaces de causar un gran daño (el comando adecuado podría borrar todas tus fotos por ejemplo, pero no dañar al sistema) pero los comandos ejecutados como usuario root permiten hacer cualquier cosa, no ejecutar nada de esta forma si no se confía en la fuente o no se entiende más o menos lo que se está haciendo. 1. ¿Qué son? Android está basado en linux, un sistema operativo que se caracteriza entre otras cosas por tener un terminal (llamado shell en inglés) muy potente que permite poder controlar casi por completo todo el sistema y obtener información mediante "ordenes" más o menos complejas, estas ordenes se conocen como comandos de terminal. Los comandos en sí son programas (o ficheros con codigo ejecutable) que se guardan en /system/bin (ahí están los principales, aunque hay otros posibles sitios) así que pueden haber mods que dejen programas ahí y ya estarían disponibles para ejecutar. Un ejemplo típico es "Busybox" que añade varios comandos comunes de linux y es más que recomendable instalarlo para todo usuario que tenga el telefono rooteado. 2. ¿Para qué sirven? Como he dicho antes, mediante comandos se pueden hacer muchísimas cosas, aunque casi todo lo que nos pueda interesar puede hacerse mediante acciones normales de tasker. Sin embargo hay cosas generalmente avanzadas que no se pueden hacer directamente y requieren hacer uso de comandos del terminal. Como se hacen ciertas cosas y que se puede hacer ya es otra historia, en este aspecto linux es muy diferente a Mac OSX o a Windows, no hay una guia general de linux porque hay muchas variantes con pequeñas y no tan pequeñas diferencias entre si, Android es solo una de estas variantes especialmente adaptada para dispositivos mobiles. Pero por otra parte la comunidad linuxera destaca por ser muy colaborativa y publicar mucha documentación de tutoriales, soluciones a problemas y demás, asi que no es dificil encontrar recursos si se busca "como hacer XXXXX en android", especialmente si sabes inglés. 3. Ejemplo práctico Una limitación habitual en tasker es querer controlar si en un momento dado una aplicación está en marcha. Esto es muy sencillo con aplicaciones "normales" ya que basta con hacer un perfil con el contexto "aplicación -> la aplicación a controlar" y una tarea de entrada que cree una variable %APPX a 1 y en la tarea de salida cambie el valor de la variable a 0. Sin embargo, en aplicaciones que se puedan quedar en segundo plano esto no funciona, ya que en cuanto la aplicación deja de estar en primer plano, tasker piensa que se ha salido de la aplicación y la variable se pondría a 0. Sin embargo el sistema operativo si que sabe que la aplicación sigue en marcha, ¡asi que vamos a preguntarle usando comandos! Antes que nada, para poder lanzar estos comandos hay que tener un emulador de terminal instalado, el más conocido es este: https://play.google.com/store/apps/d...al.androidterm, pero cualquiera debería valer. El comando completo a usar sería este: Código:
cat /proc/$(pgrep %pname$)/oom_adj Primero que nada, Android no usa los nombres típicos por los que conocemos a las aplicaciones a nivel interno, sino lo que se llama el package name, y a nivel aún más interno (lo explicaré luego) el PID. Para averiguar el package name de una aplicación lo más facil es buscar la aplicación en la web de google play y fijarse en la URL del navegador, el package name es lo que pone entre el "id=" y el primer "&" si lo hay, por ejemplo para el terminal emulator el package name es jackpal.androidterm. Cuando Android lanza una aplicación le asigna un PID (Process ID) dinámico (si la aplicación muere y se vuelve a lanzar el nuevo PID que le asigne casi seguro que no será el mismo), que es un número que en adelante el sistema usará internamente para el manejo de memoria y más cosas. Ahora, volviendo al comando, en realidad se trata de un comando dentro de otro, primero que nada habría que reemplazar %pname por el package name de la aplicación que queramos comprobar (para el ejemplo usaremos el propio terminal, recordemos: jackpal.androidterm) y si ejecutamos el comando interno que es Código:
pgrep jackpal.androidterm Y ahora por fin la explicación del comando completo: se da el caso de que android crea una carpeta por cada proceso en /proc (de ahí su nombre) y dentro de la carpeta de cada proceso entre otras cosas hay un archivo llamado "oom_adj" que solo contiene un numero con el estado de ejecución del mismo. El comando "cat" simplemente muestra el contenido del archivo que le digas, de modo que cuando ejecutamos Código:
cat /proc/$(pgrep jackpal.androidterm$)/oom_adj Código:
cat /proc/25419/oom_adj Para el caso que nos interesa, un "0" significa que está en primer plano y un "2" en segundo plano, cualquier otro valor es que está en otro estado que podemos considerar como inactivo. Espero no haberos perdido por el camino soy consciente que no es el ejemplo más sencillo, pero como digo, para hacer cosas sencillas no suele ser necesario usar el terminal, y he tratado de explicarlo lo mejor posible y no limitarme a soltar el comando y que penseis que hace magia...4. Usar comandos con Tasker Tasker tiene predefinida una acción en "Script -> Ejecutar consola" (o "Script -> Run shell" en inglés) que permite ejecutar comandos. No confundir con las otras acciones en esta categoría: - "Javascript" y "Javascriptlet" Son casi identicos y sirven para ejecutar código javascript dentro de tasker, no comandos de terminal. Lo cubriré en un proximo tutorial. - "Ejecutar Script" Sirven para ejecutar código en otros lenguajes (como python o php) hay que instalaer los interpretes con SL4A. Lo cubriré en un proximo tutorial. En la acción se puede definir el comando a ejecutar (permite usar variables), la cuenta atrás o "timeout" (tiempo máximo de ejecución, si se sobrepasa se cancela la orden, 0 es para infinito), y unas variables para almacenar la "salida" o "output" (lo que devuelve el comando), los "Errores" (posibles mensajes de error si algo va mal) y el "Resultado" (no confundir con la salida, esto es un codigo numérico que indica si la ejecución ha ido bien (devolvería 0) o no (devolvería cualquier otra cosa, depende del comando y el error), este valor no se ve al ejecutar comandos a mano desde el terminal) y tambien se puede marcar si se quiere ejecutar el comando como usuario root o no (hay comandos que necesitan ser ejecutados como root, mantenerlo desactivado siempre que sea posible). Lo de "continuar tarea en caso de error" es conveniente marcarlo, ya que hay comandos que es normal que no devuelvan un resultado 0: en el ejemplo de antes por ejemplo, si el proceso que buscamos no tiene PID en el momento de ejecutar el comando, el fallará porque intenta mostrar un archivo que en ese momento no existe y si no marcamos esta opción la tarea se pararía y no haría nada más. 5. Comandos habituales / utiles Nota: los comandos van entre comillas, pero hay que ejecutarlos sin ellas, para los parametros que hay que pasarles (las rutas de directorios, ficheros, etc...) si contienen espacios hay que rodearlos con comillas para que no piense que son varios parametros, por ejemplo cat /sdcard/mi archivo.txt habría que ejecutarlo como cat "/sdcard/mi archivo.txt" y cp /sdcard mi archivo.txt /sdcard/mi otro archivo.txt sería cp "/sdcard mi archivo.txt" "/sdcard/mi otro archivo.txt"
Este tutorial pretende ser una introducción, los detalles concretos sobre el uso de todos estos comandos se pueden encontrar facilmente por internet 6. Obtener ayuda Todos los comandos suelen tener una ayuda con una descripción de lo que hace el comando y las distintas opciones si las tiene. Normalmente para ver esta ayuda se hace escribiendo en un terminal "comando -h" o "comando --help" (un guión cuando es una letra y 2 para la palabra completa). Si no funciona ninguna de las dos formas (devolverán un error del tipo "no existe la opción" o algo así) algunos comandos muestran la ayuda al escribir el comando a secas, sin ninguna opción ni parametro, ojo no probar esto si un comando, por su nombre, podría tener sentido si se ejecuta sin parametros, ya que podría ejecutarse si hacemos esto. 7. Conceptos avanzados Redirigir entrada y salida de comandosEs mi primer tutorial (pretendo hacer alguno más con el tiempo si este tiene buena acogida Última edición por maid450 Día 06/02/14 a las 08:57:18 |
| Los siguientes 17 usuarios han agradecido a maid450 su comentario: | ||
|
|
|
#2
|
||||
|
||||
|
Brutal! Mil gracias!
|
| Gracias de parte de: | ||
|
#3
|
||||
|
||||
|
Exelente, Maid, muchas gracias. No me he perdido en absoluto, creo que está muy bien explicado.
Cita:
La acción Ejecutar-consola tiene los siguientes parámetros o elementos especiales (sigo traduciendo para atajar posibles dudas): - Comando (texto, obligatorio) - Cuenta atrás en segundos (timeout; por defecto es cero, máximo 120) - Usar Root (opcional) - Almacenar Salida En (una variable, opcional) - Almacenar Errores En (una variable, opcional) - Almacenar Resultado En (una variable, opcional) - Continuar Tarea Tras Error (opcional) Creo que ya lo puedo aplicar al caso que me interesaba. En mitad de una tarea yo quería poner una condición para saber si la app Poweramp estaba funcionando y en tal caso no ejecutar algunas acciones de ajuste de volumen. El package-name es "com.maxmpz.audioplayer". Creo una tarea de prueba con las siguientes acciones 1 Ejecutar-consola - Comando: pgrep com.maxmpz.audioplayer - Almacenar Salida En %salida - Continuar Tarea Tras Error: activado 2 Si %salida ~ %* 3 Notificación: Poweramp NO encontrado (%salida) 4 Else 5 Notificación: Poweramp SI encontrado (%salida) 6 Fin si (End if) Lo pruebo antes de ejecutar Poweramp y la notificación dice Poweramp NO encontrado (%salida) Ejecuto Poweramp y mientras oigo música vuelvo a ejecutar la tarea, obteniendo Poweramp SI encontrado (20687). Fantástico. Todavía no es perfecto: cuando paro la música y "cierro" el Poweramp (pulsando atrás), android lo sigue teniendo como activo, con el mismo PID (20687), no sé cuanto rato tiene que pasar para que eso cambie. Puedo quitar el Poweramp de la lista de apps recientes (sistema de conmutación entre tareas que tiene Android4) y entonces ya deja de tener PID (Poweramp NO encontrado). Tienes todo mi apoyo y ánimo para continuar con más lecciones porque creo que has abierto una veta muy prometedora. Al menos yo estoy muy interesado. Gracias de nuevo. |
| Gracias de parte de: | ||
|
#4
|
||||
|
||||
|
Impresionante, hasta yo que soy un cibercateto lo he entendido!
![]()
|
|
#5
|
|
|
Cita:
La tarea que has hecho está bien para entender un poco el tema de los PIDs y tal, pero para comprobar si la aplicación está realmente activa o no lo que tienes que ver es el valor que hay en el fichero /proc/%PID/oom_adj y para eso es el comando completo: Código:
cat /proc/$(pgrep jackpal.androidterm$)/oom_adj Esto se puede hacer en tasker con un Si %salida ~ 0/2 |
| Gracias de parte de: | ||
|
#6
|
||||
|
||||
|
Im-presionante!!
![]() Pues no sólo te subimos el tuto al recopilatorio si no que además inaugura sección. Muchas gracias maid450. ![]() FDO: Mlesir. |
|
#7
|
||||
|
||||
|
Cita:
|
|
#8
|
||||
|
||||
|
Resumiendo y concretando el tema de detectar otra aplicación, para dummies: en una tarea de Tasker podemos saber si otra app concreta está funcionando, ya sea en primer plano o en segundo plano, y dependiendo de eso se pueden tomar decisiones dentro de la tarea. Los detalles son los siguientes.
En primer lugar hay que conocer el nombre que la aplicación tiene dentro de Android. Es lo que técnicamente se llama package name, y la forma más sencilla de obtenerlo es buscar la aplicación en la web de Google play y fijarse en la URL del navegador: el package name es lo que aparece tras el "id=" (y antes del primer "&", si es que lo hubiera). Por ejemplo, para la app Android Terminal Emulator la URL puede ser https://play.google.com/store/apps/details?id=jackpal.androidterm o algo más largo como por ejemplo https://play.google.com/store/apps/details?id=jackpal.androidterm&feature=nav_result#?t=W251bGwsMSwyLDNd Pues bien, en ambos casos se ve que el package name es jackpal.androidterm De forma similar, debes obtener el package name de la app que tú quieras controlar. Ya en Tasker, hay que usar la acción (del grupo Script) llamada Ejecutar-consola. En la casilla del Comando ponemos cat /proc/$(pgrep jackpal.androidterm$)/oom_adj sustituyendo jackpal.androidterm por el package name de la aplicación que hayas elegido. La acción Ejecutar-consola tiene, más abajo, una casilla rotulada como Almacenar Salida En ; ahí podremos el nombre de una variable que recoja la información devuelta por el comando; por ejemplo podemos escribir %salida. Y bastante más abajo hay que marcar una opción que lleva el rótulo Continuar Tarea Tras Error. Con eso ya hemos terminado de configurar esta acción. Cuando la tarea se active, Android ejecutará el comando y devolverá una u otra información según sea el estado de la aplicación. A los efectos que nos interesa, si la app está ejecutándose (en primer o segundo plano) el comando devolverá o bien el valor 0 (cero) o bien el valor 2 (dos). O sea que, a continuación, podemos usar en la misma tarea una condición en base a la variable que hayamos usado, del tipo siguiente Si(If) %salida ~ 0/2 (Si %salida coincide con cero o dos) que será cierta si la app se está ejecutando. O bien podemos usar una condición del tipo contrario Si %salida !~ 0/2 (si %salida no coincide con cero o dos) que será cierta si la app no se está ejecutando. Eso es todo. Si quieres más información, lee este hilo desde el inicio, y/o la página siguiente: http://www.htcmania.com/showthread.p...95#post7356195 |
| Gracias de parte de: | ||
|
#9
|
|
Hola a todos.
Estoy en fase de lectura de este subforo y aprendiendo cosas que por mí solo no he sido capaz de hacer. He realizado perfiles de los más básicos, pero estoy intentando aprender para cosas más complejas. Gracias a este hilo he podido hacer lo que hacía tiempo intentaba sin éxito, que al abrir una aplicación que necesite GPS lo active y que cuando salga lo desactive. El problema lo encontraba cuando se quedaba la aplicación en segundo plano y desactivaba el GPS. Solucionado gracias a este aporte!!!! Lo dicho, seguiré leyendo, aprendiendo y agradeciendo. Y si algún día puedo, aportando. |
| Gracias de parte de: | ||
|
#10
|
||||
|
||||
|
Hola Diapa. Bienvenido al foro de Tasker.
Si todavía no lo has hecho, te sugiero la lectura de las "Recomendaciones para participar" http://www.htcmania.com/showthread.php?p=8982303 Nos alegramos de que aquí encuentres cosas interesantes, y de que lo comentes. |
| Gracias de parte de: | ||
|
#11
|
|
Puesto manos a la obra, me he encontrado un problema.
Con una aplicación, ejecuto el comando en la consola, lo guardo en una variable (%salida) y lanzo un flash con texto %salida. Como tarea de salida de la aplicación, lanzo otro flash con la misma variable para esperar el 2 cuando esté en segundo plano. Cuando abro la aplicación me da 0 en el flash. Hasta ahí bien, pero cuando le doy al botón home para ir al escritorio y dejarla en segundo plano (queda el icono en la barra de notificaciones y la apli sigue corriendo -es un informador de radares- y funcionando) el flash que me lanza es %salida. No hay 2 con lo que no me apaga el gps cuando le pongo el condicionante "si %salida es distinto a 0/2" apaga gps. ¿?¿?¿? Saludos. |
|
#12
|
|
Aunque yo este script no lo controlo te aconsejaría que hagas lo q se debe hacer siempre que algo no funciona: probar todas las partes de manera aislada.
Primero prueba el script por si solo a ver si efectivamente te detecta q la app esta en segundo plano. Luego las distintas partes del perfil, puedes ir poniendo pop up con las variables que utilices como texto del pop up, para ir viendo q valores van tomando. De esta manera sabrás que parte es la que falla. |
|
#13
|
|
|
Cita:
Cuando el valor de %salida es "%salida" significa que la variable no está definida, y si se ha ejecutado el comando esto solo puede pasar en caso de que el comando devuelva un error. En principio no tiene porqué ser malo ya que una de las posibilidades al ejecutar el script es que la aplicación objetivo no esté en ningún estado de ejecución y por tanto no exista el fichero "/proc/xxxxx/oom_adj" y devolvería un error (por eso en la acción hay que marcar "continuar tarea tras error") aunque si la app está en segundo plano esto no debería pasar y el error podría ser otra cosa debido a que haya algo mal. Lo que puedes hacer para encontrar el error es: - lanzar la aplicación en cuestión. - salir sin cerrarla, dejándola en segundo plano - abrir el emulador de terminal (en el primer post recomiendo uno) - lanzar el comando manualmente (copia el comando desde tasker y pegalo en el emulador de terminal) Así verás lo que devuelve el comando, y si es un error debería describir que es lo que pasa. Ya comentas que tal! |
|
#14
|
|
Bueno, pues un problema solucionado. Gracias por las respuestas, al leerlas se me ocurrió la solución.
Explico: Tenía como evento "aplicación-CamSam" (informador de radares) Como tareas: 1. GPS on 2. Ejecutar consola (comando para que mandara la respuesta a %camsam, continuar tarea tras error: activado) 3. Flash %camsam Al abrir la apli todo bien y flash informando un 0. Como tareas de salida (aquí estaba el error) 1.Flash %camsam (para verificar el cambio) 2.Si %camsam es distinto que 0/2 3.GPS off 4.Fin si Me daba error: cuando la ponía en segundo plano el flash me marcaba "%camsam" y no el 2 esperado. Por lo consiguiente, me apagaba el GPS cuando no era lo que quería. Con vuestras respuestas caí en que el cambio en la variable no se producía a 2 porque simplemente no había vuelto a ejecutar en la consola el comando (ví, como aconsejabais, que con la apli en segundo plano y abriendo el terminal me respondía con el 2 pero en la variable no lo cambiaba) Solución: Como tarea simplemente GPS on Tareas de salida: 1.Ejecutar consola (comando para que mandara la respuesta a %camsam, continuar tarea tras error: activado) 2.Si %camsam es igual que 0/2 3.GPS on 4.Else 5. GPS off 6. Fin si Y a funcionar perfectamente. Muchas gracias!!!!! Problema nuevo: cuando quiero hacer lo mismo con el Endomondo no me ejecuta bien el comando. Tengo la sensación que el nombre que da el Google Play en su URL no es el correcto para el comando porque da error cuando lo ejecuto directamente en el terminal teniendo el Endomondo abierto. Hay alguna manera de ver qué aplicaciones corren en segundo plano con el Tasker?? porque esa sería otra solución. Muchas gracias. La verdad es que me apasiona el Tasker y quiero sacarle todo el jugo que pueda, pero estoy todavía muy verde. |
|
#15
|
|
Hay algún comando que me diga qué aplicaciones hay en segundo plano? Es que con el Endomondo no hay forma que funcione el comando que me da la URL del Google Play.
Gracias. Saludos. |
|
#16
|
|
|
Cita:
Sale mucha morralla del sistema, pero también salen los programas en ejecución en primer o segundo plano. |
|
#17
|
|
|
Cita:
Saludos. |
|
#18
|
||||
|
||||
|
Acabo de leerlo, y está muy bien explicado, los que estamos aprendiendo un poco a usar tasker te lo agradecemos...
|
| Gracias de parte de: | ||
|
#19
|
||||
|
||||
|
Cita:
http://www.htcmania.com/showthread.php?p=8982303 |
|
|
|
#20
|
|
sqlite3 /data/data/com.whatsapp/databases/wa.db "SELECT jid FROM wa_contacts WHERE unseen_msg_count>'0' ORDER BY id DESC ;"
Alguien sabría decirme como hacer en este tipo de sentencias para que los resultados me los devuelva separados por comas, o por otro signo? Es que los devuelve pero separados por intro y eso tasker no lo detecta. |
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 20:46:07 (GMT +1)
HTCMania: líderes desde el 2007

soy consciente que no es el ejemplo más sencillo, pero como digo, para hacer cosas sencillas no suele ser necesario usar el terminal, y he tratado de explicarlo lo mejor posible y no limitarme a soltar el comando y que penseis que hace magia...






