Acceder

Ver la Versión Completa : [ CONSULTA ] Script. Cómo saber que archivo esta abierto.


mlesir
19/12/13, 18:34:48
EDITADO A 30/01/2014:

Todo este hilo se centra en poder saber con Tasker que archivo esta abierto en una determinada ruta. Tasker no lo puede saber sólo es capaz de decirte que se ha abierto determinada carpeta o archivo, pero dentro de un directorio si quieres saber cúal es el archivo exacto que esta abierto sólo se puede con script y usando comandos. Pues después de pelearme con esto mucho tiempo esto es lo que he conseguido saber, os lo dejo aquí por si a alguien le puede ser de utilidad o puede hacer avanzar este tema:

1- Accion de Tasker Ejecutar Consola: lsof "ruta del archivo (ojo, empezando por "/")

En mi caso no funcionó nunca. Me aparecian todos los archivos abiertos, es como si ignorase lo de la ruta.

2- lsof | grep tasker

Funciona a medias porque si es verdad que me da un listado restringido sólo a lo que ha abierto Tasker pero no me da el nombre de los archivos.

3- Algunos archivos en realidad no se quedan abiertos:

Por ejemplo Tasker cuando se abre la ayuda carga los datos del archivo html en la webview y lo cierra. No es como los tipicos archivos de texto que abres con un procesador de texto y que mientras los tienes abiertos estan abiertos. Igualmente sospecho que algunas apps incluso con archivos de texto se traen la información y luego los cierran.

4- basename "$(lsof -p $(pidof mediaserver) | grep -m 1 mp3)" .mp3

Este si funciona. Pero lo hace con el archivo de música que este abierto (reproduciendo)

5 ls -u "ruta del archivo":

.Esto lo que te da es un listado (comando ls) ordenado por fecha de último acceso (opción -u). En ppo todos estos comandos o binarios los tendrás instalados en la carpeta bin. Dependiendo del movil, Rom etc, tendras algunos, otros no, y aunque tengas un comando o binario puede que no tengas todas las opciones. En mi caso no tenía la opción -u para el comando ls. Pero como instale busybox (que en realidad lo que hace es instalarte unos binarios, los suyos de busybox) si que ahi tenía esa opción. Si abres busybox y les das a applanet te da un listado de todos los comandos que trae con sus opciones.

6 busybox ls -u /la/ruta/del/directorio | head -1

Me funcionó ( luego cuento el pero). Para poder utilizar el binario de busybox y no el que trae el móvil. Ademas con head 1 (o 2,o 3...) le dices cuantos resultados quieres que te de. Con uno te dará el último archivo abierto, con dos el último y el penultimo, etc.
Por lo que creo si en vez de "busybox" pones una ruta entonces ejecutara el binario de esa ruta. Por ejemplo podrías ejecutar el sqlite del plugin whatstasker en vez de otro si es que por lo que sea te interesa hacerlo asi.
El pero ( que creo que Maid se lo olió) es que el sistema de archivos esta montado para que no cambie la fecha de acceso mas que cuando es superior a la de modificación. Esto quiere decir que si accedo a un archivo mas de una vez sólo guardará la fecha de acceso primera el resto no. Esto al parecer lo hace por razones de economía de proceso, para ahorrar tiempo. Esto quiza se podría cambiar pero tendría creo que hacerse una partición del sistema, etc, Total muy por encima de mis capacidades.

7- stat -c "%X /ruta/del/archivo"

Esta te da el tiempo en el que se abrió por ultima vez ese archivo.

8 Con el comando touch (perdón por no poner el script completo pero ahora no lo encuentro)

Pues bien con este comando usando una de sus opciones puedes actualizar la fecha de acceso y ponerle la que quieras. Como si quieres poner que se accedio en 1945! Esto en ppo haría que si y sólo si te aseguras de que la carpeta sólo se va a abrir de manera que la puedas controlar SI puedes saber qué archivo está abierto. Se trataría de usar un contexto de archivo abierto de Tasker. Tarea de entrada
1-Ejecutar consola el comando ls que nos dirá que archivo ha sido el ultimo en abrirse.
2-Actualizar la fecha de acceso con touch.

Al final lo conseguí (gracias a Maid y Soymicmic) pero a medias. Además en este caso no vale porque los archivos de ayuda de Tasker no puedo controlar si se abren o no. Es decir se podría pero me parece que no es aceptable que Tasker este continuamente chequeando cuando se abre una carpeta, listando y cambiando la fecha, al menos para mi. O sea que sigo sin poder saber qué ayuda se esta consultando en Tasker. Por supuesto con %WIN o con el script para saber que pantalla se esta mostrando ni de broma porque Pent no le puso titulo específico a cada ayuda.
Si que he descubierto una cosa que quizás te pueda interesar Maid aunque creo que ya lo sabrás. Tasker no se detecta asi mismo a través de %WIN pero una apk hecha con Factory si.
Bueno creo que no me dejo nada, ah bueno si deciros por último que con touch puedes crear archivos cosa que no se puede con Tasker (sólo deja Directorios). Y que la verdad lo de los comandos linux hay que perderle el miedo, no es tan difícil. Es sólo cuestión de googlear e ir probando. A este respecto yo prefiero hacerlo desde un emulador de terminal pq si falla te da información de que pasa, Tasker se limita a decirte que ha habido un error.

AQUÍ EMPIEZA EL HILO ORIGINAL EN EL SE EXPLICAN MAS DETALLADAMENTE ALGUNAS DE LAS COSAS QUE HE EXPUESTO
-----------------------------------------------------------------------------------------------------------------------------------------------------


Pues estoy probando con lsof y grep pero no hay. manera. Creo que estoy cerca pero no lo acabo de conseguir.

Poniendo esto en ejecutar consola:

lsof | grep /mnt/sdcard/Tasker... Etc el resto de la ruta al directorio del que quiero saber que archivo esta abierto.

Consigo que me devuelva un resultado donde se puede leer la ruta pero no pone el nombre del archivo específico.

Si pongo esto:

lsof /mnt/sdcard......

Me pasa lo mismo que si pongo solo lsof.. me devuelve toda la lista.

A ver si alguno que sepa de Linux me puede decir como hacerlo. Gracias.

maid450
19/12/13, 20:08:16
Que es lo que quieres conseguir exactamente?

soymicmic
19/12/13, 22:53:24
No se que buscas, pero con lsof sacas la lista completa de ficheros abiertos y con grep lo que haces es filtrar.

Al concatenar los dos comandos con la barra vertical lo que haces es aplicar el filtro a la lista obtenida.

Supongo que esto ya lo sabías.... ahora queda que nos digas que quieres obtener a ver si podemos ayudarte ;)

mlesir
20/12/13, 00:15:39
Lo que quiero es que cuando le doy en tasker al interrogante en la acción correspondiente saber que acción estoy consultando si es wait, o go to, etc. Con %WIN en tasker no detecta nada. Con el script de maid para detectar la pantalla o aviso que se muestra es siempre el mismo nombre.
Así que lo q me queda es por archivo abierto mediante script.
Quisiera que este script en un momento dado me diga que archivo exactamente esta abierto en tasker/userguide/es/help para así saber que acción es la que se está consultando.

mlesir
20/12/13, 08:08:15
Se me olvido comentaros que tampoco tengo manera de saber versión que tengo ya que no me funciona el lsof man ni lsof -h ni nada parecido.
Lo que me da rabia es que en principio en todos los post que he leído parece que es fácil : lsof pero a mi haciendo todas las combinaciones posibles me devuelve lo mismo que si metiera sólo lsof, o sea todos los archivos posible. Tampoco con lsof +D...
Instale busybox por si acaso y nada.
Una cosa que me mosquea es que si fuera fácil estaría implementado en una acción de tasker y no lo está.

maid450
20/12/13, 09:36:00
Entonces el problema es que con lsof no te sale el archivo que quieres que te salga o que no puedes etraer la ruta?
Prueba con una accion que haga un "lsof | grep Tasker" en el momento en que tienes abierto el fichero de ayuda que quieres y que vuelque la salida del comando a un fichero y pega aquí el resultado que te da, a ver si se puede hacer algo

soymicmic
20/12/13, 15:24:15
Mmm... Curioso

Parece que al hacer lsof se olvida del resto...

Se me ocurre redirigir la salida de lsof a un fichero temporal:
lsof > fichero_temp

Y ahora aplicar el filtro a ese fichero:
cat fichero_temporal | grep loquesea

Y borras el temporal:
rm -rf fichero_temporal

Que te parece?

mlesir
20/12/13, 17:41:25
Ante todo gracias por el desplieguede ayuda. Aunque para lo que yo lo quiero es algo muy especifico creo que si se consiguiera, este script podria tener muchas posibilidades y seria muy útil.

Pruebas con lsof | grep Tasker :
Abro tasker y la ayuda y me voy a inicio. Compruebo con apps recientes que efectivamente tasker esta en esta pantalla o sea que tendra el fichero abierto ( tambien he hecho pruebas con documentos de texto normales).
Ejecuto la sentencia. No me devuelve nada pq se me olvido ejecutar antes "su". Ejecuto su y me sale una linea nueva con esto:
lsof | grep Tasker
Pienso que raro....ejecuto lsof a secas y me sale todo el mogollon. Despues vuelvo a ejecutar lo que dice maid y sale esto:
Couldn't read /proc/6163/cmdline
Couldn't read /proc/6164/cmdline

Pruebo a abrir otra nueva en la consola y meto lo mismo. Ahora ya ni saleel couldnt read...
No se pq me da la ventolera y pienso en probar poniendo tasker no Tasker. Tachan! Me da esto:

root@GT-N7000:/ # lsof | grep Tasker
lsof | grep Tasker
1|root@GT-N7000:/ # lsof | grep tasker
lsof | grep tasker
system_se 2236 system 190 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/res.zip
com.andro 2432 u0_a42 54 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/res.zip
com.cyano 2632 u0_a45 50 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/res.zip
net.dingl 2831 u0_a73 37 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/pkg.apk
net.dingl 2831 u0_a73 39 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/pkg.apk
net.dingl 2831 u0_a73 56 ??? ??? ??? ??? /data/data/net.dinglisch.android.taskerm/databases/webview.db
net.zhdev 2835 u0_a106 37 ??? ??? ??? ??? /data/app/net.zhdev.whatstasker-1.apk
net.zhdev 2835 u0_a106 38 ??? ??? ??? ??? /data/app/net.zhdev.whatstasker-1.apk
android.p 4915 u0_a1 88 ??? ??? ??? ??? /data/app/net.zhdev.whatstasker-1.apk
android.p 4915 u0_a1 117 ??? ??? ??? ??? /mnt/asec/net.dinglisch.android.taskerm-1/res.zip
root@GT-N7000:/ #



Nada que que ponga run shell que es la accion que estoy consultando y por tanto el archivo que esta abierto. Pruebo a abrir un texto con el editor de root explorer, lo dejo abierto y ejecuto lo mismo pero poniendo explorer. Me sale una cosa parecida pero en ningun casoel nombre del archivo de texto. Ni siquiera la ruta aperece por algun lado.
Pruebo a poner una cancion en Apollo y en Tasker en run shell con root marcado poner esto:

basename "$(lsof -p $(pidof mediaserver) | grep -m 1 mp3)" .mp3

En la variable donde se almacena la salida me sale esto: ACDC Back In Black( que grandes!....)

Ahora pruebo en tasker y ejecutar consola lo de lsof | grep Tasker. Me sale en salida esto: com.joaom 8678 u0_a7939 ??? ??? ??? ??? data/data/com.joaomgcd.autovoice/databases....etc.
Si pruebo con tasker en minusculas esta vez el resultado si es igual que en la consola.
Igual resultado en la consola de tasker con root explorer y el documento de texto normal.
Os hago dos preguntas: a vosotros os funciona? Y puede ser que sea cosa de permisos?
Ahora me pongo con lo que dice sonny y a ver que tal.

mlesir
20/12/13, 19:26:02
Soymicmic funciona lo que me dices. Pero gracias a lo tuyo me he dado cuenta de que lo que maid dice tambien funciona. Si abro un texto con office suite o dejo a file magic editando el nombre de un documento vuestros scripts y lsof lo detectan, aunque me dan mas de una linea, pero bueno ese es otro problema.
Cuando no detectan nada es cuando edito un archivo con root explorer o abro con tasker la ayuda y me sale la ventanita con el texto. Incluso teniendolo en primer plano y la tarea de lsof ejecutandose con una espera para que empiece cuando yo ya lo tengo todo en primer plano.
¿Puede ser que en este caso el burro no sea yo y el que no se entera es lsof?
Me parece que mi idea de añadir notas nuestras de una manera comoda a las pantallas de ayuda de tasker se esta esfumando....eso si parece que ya podemos saber cuando hay archivos abiertos y cuales, aunque no funcione con todos.

maid450
20/12/13, 19:44:57
Lo que me temo es que tasker abre el fichero de ayuda, vuelca el contenido en una webview (de ahí que haya un fichero webview.db abierto) y cierra el fichero, por tanto el lsof no muestra nada, ya que este comando lista ficheros que se encuentran abiertos en ese momento...
Puedes probar abrir el contenido de esa base de datos (webview.db) tal vez tenga algo te ayude a ver que fichero de ayuda está mostrando en ese momento

mlesir
20/12/13, 19:50:27
Para mi que llevas razón. Haré lo que dices a ver.
Bueno en todo caso ya tenemos un script nuevo que nos da más posibilidades no?
Me sigue mosqueando lo de root Explorer pero bueno a lo mejor hace otra cosa similar a tasker.
Gracias maid.

soymicmic
20/12/13, 23:40:03
Mmmm... Puede que tenga que ver qué usuario ejecuta las tareas... Con sudo deberías ver todos porque eres root...

Hay un comando que es whoami para que te diga quién eres

Ah! Y grep creo que con parámetro -i deja de ser case sensitive

mlesir
23/12/13, 21:33:28
Pues lo de whoami ni funciona dice que un know. (en xbin sin embargo si esta el archivo, mientras que en bin no)
El caso es que parece que tampoco abre la base web view. db Un perfil de abrir archivo reacciona si es el archivo help pero si es el webview. db. no.
He probado Incluso a hacerlo imposible de usar y la ayuda sigue apareciendo sin problema. Así que no parece que lo use, igual es para cuando es en línea a través de Internet.
Ahora estoy intentando otra cosa. Se trata de usar el comando Listar "ls" junto la opción - u (por fecha de último acceso). ls funciona pero con - u me dice que la opción es desconocida. El caso es que investigando he logrado saber que busybox la cual tengo instalada si tiene esa opción. También he descubierto que tengo dos carpetas con binarios una en xbin (la de busybox no?) y otra en bin( toolbox la que viene con cyanogen 4.3 no?
La cosa es como hacer que utilice la de busybox. Suponiendo que Android efectivamente guarde la fecha de acceso y que busybox tenga la opción de - u debería ser posible saber cual es el último archivo abierto con lo cual sabremos que archivo de ayuda se está consultando.
Tampoco se muy bien donde exponer esto, ya que en HTC manía no he encontrado un foro específico para estas dudas.

Caravantes
23/12/13, 22:45:13
Tampoco se muy bien donde exponer esto, ya que en HTC manía no he encontrado un foro específico para estas dudas.

Puesto que no es un tema de hardware, supongo que la pregunta valdrá el foro general de software (Otro software para Android)
http://www.htcmania.com/forumdisplay.php?f=161

Esa pregunta también encaja en el foro de "Programación y Desarrollo para Android"
http://www.htcmania.com/forumdisplay.php?f=153

Pero te sugiero que -de acudir a este último foro- no solo preguntes lo del comando ls -u, creo que ahí puedes hacer también la pregunta inicial del hilo (Cómo saber qué archivo esta abierto) que también les va a parecer interesante y quizá puedan darte algún método alternativo.

maid450
24/12/13, 08:23:51
La cosa es como hacer que utilice la de busybox. Suponiendo que Android efectivamente guarde la fecha de acceso y que busybox tenga la opción de - u debería ser posible saber cual es el último archivo abierto con lo cual sabremos que archivo de ayuda se está consultando.

Muy buena idea usar la fecha de acceso, hay ciertas posibilidades de que no funcione (intentalo y si no funciona explicaré porque puede ser) pero vale la pena intentarlo.

Para usar el ls de busybox basta con hacer busybox ls -u Lo he probado y me funciona, mientras que ls -u a secas no.

El comando completo para sacar el fichero accedido más recientemente en un directorio sería:
busybox ls -u /la/ruta/del/directorio | head -1

mlesir
24/12/13, 12:30:32
Otra vez el Ayatola de los scripts el sultán del Shell lo ha vuelto a hacer!
Funciona perfecto Maid. Lo he probado incluso con un retardo para que me de tiempo a irme a tasker y abrir una ayuda. Y efectivamente ahí está el flash mostrandome el archivo de ayuda q se corresponde con la ayuda que se me muestra.
Pues ya solo me queda montar el proyecto y a meterle mano a Tasker. Gracias Maid y Soymicmic por vuestra ayuda.
Ya cuando pueda editaré el primer post poniendo los scripts y todo ordenado para que la gente lo pueda usar.

mlesir
30/01/14, 18:52:38
Editado el primer post resumiendo lo conseguido hasta ahora.