spheras / messic

Music Organizator and Player. Downloads here: http://spheras.github.io/messic/
28 stars 8 forks source link

Automatic Messic Service Start in Windows #123

Open ruayrod opened 8 years ago

ruayrod commented 8 years ago

Hi, guys, how can I automatically start Messic Service in Windows 7 or 10? Thank you!!

AlmostLook commented 8 years ago

Hi good morning ruayrod,

We're looking over your request; there's a messicservice.vbs into bin folder which do that; please let us to configurate this script properly to run automatically from windows 7 or 10 like a service; we'll answer u as soon as possible.

ruayrod commented 8 years ago

Ok. Thank you. While I try myself with that file.

spheras commented 8 years ago

Yes, messicservice.vbs is one option. In windows, the messic service is launched by this visual basic script file, but it receives two parameters: the whole classpath (list of jars separated by semicolon ; ), and a second parameter which is the absolute path for the music folder. Then, the call to this vbs could be something like:

messicservice.vbs "../classpath/firstfile.jar;../classpath/secondfile.jar;etc..." c:\mi\path\to\my\musicfolder

so, the problem is just to put as the first param all the jars files in the classpath messic folder. In linux we do this by scripting, you can build the same for windows or just put adhoc all the existing files in classpath folder.

The second option, which in my opinion is better, is to call directly to the monitor app by console. The monitor is the app which start and stop the monitor. Could you (@AlmostLook or @ruayrod ) check if you can for example do this in windows? (I don't have a windows at this moment near)

messic.exe -?

could you tell me if this return a help command menu? if it works, then you can start and stop the service by command. If it is not possible, then there is other option, which is to call directly to the java monitor class. Check that and let me know the result please.

ruayrod commented 8 years ago

Hi spheras, the first options don't go on, maybe I don't be write correctly. The second don't report any parameter, only it open messic app, it don't report any help text.

Sorry my bad english.

spheras commented 8 years ago

Hi @ruayrod, i will continue in spanish if you feel more comfortable and after translate to english the final solution (in other ticket to alow other persons to read it, in fact we should create a wiki section for this. I think it is very interesting - by the way, do you mind to write it when we finally solve this?? :D, as you see we need a lot of help)

Arrancar messic como servicio es sencillo, desde el punto de vista de las clases javas a las que hay que llamar, aunque no esta documentado. La dificultad estriba en los scripts/binarios que se han creado para cada sistema operativo para facilitar la tarea de levantar el monitor. La applicación de monitor recibe parámetros precisamente para este tipo de cosas, levantar messic, pararlo, etc.. sin necesidad de ventana alguna. El problema es que en el caso de windows, el exe que se ha creado es difícil (no imposible) decirle que le de los parámetros a la clase java.

No he tenido mucho tiempo de mirarlo, pero para que tengas una solución rápida te he creado un fichero bat de ejemplo que llama al monitor directamente (sin exe), al cual sí le puedes pasar parámetros. Crea un fichero .bat que se llame messicservice.bat en la carpeta raiz de messic (en la raíz, no lo copies dentro de la carpeta bin). Este es el contenido que tienes que poner dentro:

SET varClasspath=./classpath/antlr-2.7.7.jar;./classpath/aopalliance-1.0.jar;./classpath/aspectjweaver-1.7.4.jar;./classpath/commons-cli-1.2.jar;./classpath/commons-dbcp-1.4.jar;./classpath/commons-io-2.4.jar;./classpath/commons-logging-1.1.2.jar;./classpath/commons-pool-1.5.4.jar;./classpath/dom4j-1.6.1.jar;./classpath/h2-1.3.171.jar;./classpath/hibernate-commons-annotations-4.0.1.Final.jar;./classpath/hibernate-core-4.2.1.Final.jar;./classpath/hibernate-entitymanager-4.2.1.Final.jar;./classpath/hibernate-jpa-2.0-api-1.0.1.Final.jar;./classpath/javassist-3.15.0-GA.jar;./classpath/jboss-logging-3.1.0.GA.jar;./classpath/jboss-transaction-api_1.1_spec-1.0.1.Final.jar;./classpath/log4j-1.2.14.jar;./classpath/messic-configuration-1.0.1.jar;./classpath/messic-service-1.0.1.jar;./classpath/messic-starter-1.0.1.jar;./classpath/org.apache.felix.framework-4.2.1.jar;./classpath/org.apache.felix.main-4.2.1.jar;./classpath/spring-aop-4.0.0.RELEASE.jar;./classpath/spring-beans-4.0.0.RELEASE.jar;./classpath/springcontext-4.0.0.RELEASE.jar;./classpath/spring-core-4.0.0.RELEASE.jar;./classpath/spring-expression-4.0.0.RELEASE.jar;./classpath/tools-1.4.2.jar

.\bin\jre1.8.0_45\bin\java -cp "%varClasspath%" org.messic.starter.Starter %1 %2 %3 %4 %5 %6

como ves, el fichero lo que hace es llamar a la máquina virtual pasándole los ficheros jars que necesita (están puestos a fuego en el fichero por hacerlo rápido) y al final todos los parámetros que tú uses al llamar al .bat. Entonces, llamando al bat de la siguiente manera, por ejemplo:

c:\Users\MiUsuario\Downloads\messic-1.0.1.app\messicservice.bat -?

vas a ver todas las opciones posibles. De tal forma que si quieres levantar el servidor tienes que escribir: c:\Users\MiUsuario\Downloads\messic-1.0.1.app\messicservice.bat -gui false -start

y si quieres pararlo:

c:\Users\MiUsuario\Downloads\messic-1.0.1.app\messicservice.bat -gui false -stop

A partir de ahí habria que crear un servicio windows o ponerlo en aplicaciones de inicio de windows. Sinceramente no sé cómo se hace esto, pero seguro que google nos puede decir mucho.
Ahora te pido yo a tí ayuda :D, podrías probar todo esto y documentarnos cómo hacer el servicio en windows, etc?? podría ser de gran ayuda para otros que tengan el mismo problema que tú.

Gracias!!

ruayrod commented 8 years ago

Bueno, pues después de probar varias veces y que no me funcionara, he descubierto que era fallo mio, hay que ejecutar el archivo .bat en modo administrador y todo funciona perfectamente. Por lo que explico en el siguiente comentario como hacer para el arranque automático desde Windows.

ruayrod commented 8 years ago

Bien, mejor por imágenes y así no hay mucho que explicar:

1, 2 y 3.- Iniciamos el Programador de Tareas: messic 01

4.- Pulsamos en Crear Tarea Básica messic 02

5 y 6.- Rellenamos el Nombre para identificarla y pulsamos Siguiente: messic 03

7 y 8.- Pinchamos Al Iniciar Sesión y Siguiente: messic 04

9 y 10.- Pinchamos en Iniciar un programa y en Siguiente: messic 05

11a.- Pulsamos Examinar y buscamos la ruta del archivo .bat, en mi caso lo tengo en el mismo directorio del programa: "C:\Program Files (x86)\messic\messic.app\MessicService.bat" 11b.- Metemos los parametros para ejecutar la tarea: -gui false start 11c.- Metemos la ruta donde se inicia el .bat sin las comillas: "C:\Program Files (x86)\messic\messic.app" 12.- Pulsamos siguiente: messic 06

13 y 14.- Marcamos la casilla para Abrir el diálogo Propiedades... pulsamos Finalizar: messic 07

15 y 16.- Marcamos Ejecutar con los privilegios más altos y Aceptar: messic 08

Cerramos todo y en el próximo reinicio tendremos Messic funcionando sin hacer nada más.

ruayrod commented 8 years ago

El único problema que le veo a hacer esto, a la hora de ser transparente al usuario que lo ejecuta, es que aparece la ventana de ms-dos durante más de 50-60 segundos hasta que la tarea se ejecuta y se cierra automáticamente dicha ventana. Parece como si le costara arrancar al servicio. Aunque en la ventana ya se puede leer el último "bye!", no se cierra hasta pasado ese tiempo, lo que puede ocasionar el cierre repentino ocasionado por el usuario impaciente...

spheras commented 8 years ago

muchas gracias por las pantallas. En cuanto tenga un hueco voy a ver la forma de publicar esta información en la wiki por si alguien más quiere hacer lo mismo. En cuanto al tema de que se abre la ventana de ms-dos, con un bat no se puede ocultar, pero sí se puede ocultar la ventana usando un vbscript.

aquí hay un ejemplo de cómo debería ser ese vbscript http://www.howtogeek.com/131597/can-i-run-a-windows-batch-file-without-a-visible-command-prompt/

este debería ser el aspecto, creo (no lo he probado):

CreateObject(“Wscript.Shell”).Run “” & WScript.Arguments(0) & “”, 0, False

ruayrod commented 8 years ago

He probado con esa solución de varias formas, pero no inicia el servicio. Incluso metiendole los argumentos "-gui false start" del .bat dentro del mismo archivo bat para que no compliquen la configuración de la tarea programada no la arranca. Si que lanza la aplicación, ya que quitando el "-gui false" para probar, aparece dicha ventana, pero el "start" no lo ejecuta.. Así que, de momento, la dejo como está. Si alguien comenta alguna otra solución o como meter los parámetros de la tarea de otra forma, aquí me tenéis para probarla. Por si queréis ver lo que he hecho adjunto estas capturas, el manual sería igual que lo de arriba pero cambiando lo siguiente: A - Archivo "Invisible.vbs" tal como comentan en "howtogeek". B- Archivo "MessicService.bat" en el que he eliminado "%1 %2" para colocar los parámetros "-gui false start". Con lo que se queda así: ".....org.messic.starter.Starter -gui false start %3 %4 %5 %6".

messic 00b

11a - Ubicación del archivo wscript.exe, para que no haya problemas he metido la ruta completa. 11b - Los dos argumentos para wscript (incluidas las comillas): "C:\Program Files (x86)\messic\messic.app\invisible.vbs" "C:\Program Files (x86)\messic\messic.app\MessicService.bat" 11c - La ruta de los archivos: C:\Program Files (x86)\messic\messic.app\ messic 06b

A esperar otra ayuda... ;)

spheras commented 8 years ago

mmmm, insisto, yo creo que debería funcionar. :D A ver si encuentro algún hueco la semana que viene para probar esto, me lo dejo pendiente! Esta semana hay que liberar ya sí o sí la 1.1.0 de messic, jeje

spheras commented 8 years ago

@ruayrod he estado probando hoy a lanzar el servicio a través del .exe y se puede perfectamente. Haz lo siguiente:

con eso levantarías el servicio, si pones en lugar de start, stop lo matas, a mi me funciona perfectamente. Si quieres ver lo que está pasando por debajo (el log de consola, te puedo indicar cómo hacerlo)

ruayrod commented 8 years ago

Bueno, como en la nueva versión tenemos el archivo messic_console.exe, ahora ya no hay que "programar" el archivo .bat por lo que en el paso 11a, hay que escribir lo siguiente (tal y como podeis ver en la captura): image

No me arrancaba el servicio automaticamente al iniciar sesión una vez actualizada a la versión 1.1.0, y era porque al actualizar borra el .bat, al mirar en la carpeta encontré el nuevo archivo messic_console.exe y vi que podía usarlo para esto.

Un saludo.

ruayrod commented 8 years ago

No se si funcionará esto, pero el Programador de Tareas deja exportar la configuración de las mismas, que igual podeis usar para que se genere automáticamente al instalar messic en windows y se importe para el usuario que desee iniciar el servicio al inciar sesión. En un archivo .xml lo metéis e importáis. Ejemplo de mi archivo "Arrancar servicio Messic.xml": <?xml version="1.0" encoding="UTF-16"?> <Task version="1.3" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <RegistrationInfo> <Date>2016-03-28T11:16:06.9567935</Date> <Author>MiPC\ruayrod</Author> <Description>Tarea para arrancar servicio Messic cada vez que arranca el ordenador.</Description> </RegistrationInfo> <Triggers> <LogonTrigger> <Enabled>true</Enabled> </LogonTrigger> </Triggers> <Principals> <Principal id="Author"> <UserId>MiPC\ruayrod</UserId> <LogonType>InteractiveToken</LogonType> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy> <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries> <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries> <AllowHardTerminate>true</AllowHardTerminate> <StartWhenAvailable>false</StartWhenAvailable> <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable> <IdleSettings> <StopOnIdleEnd>true</StopOnIdleEnd> <RestartOnIdle>false</RestartOnIdle> </IdleSettings> <AllowStartOnDemand>true</AllowStartOnDemand> <Enabled>true</Enabled> <Hidden>true</Hidden> <RunOnlyIfIdle>false</RunOnlyIfIdle> <DisallowStartOnRemoteAppSession>false</DisallowStartOnRemoteAppSession> <UseUnifiedSchedulingEngine>false</UseUnifiedSchedulingEngine> <WakeToRun>false</WakeToRun> <ExecutionTimeLimit>P3D</ExecutionTimeLimit> <Priority>7</Priority> </Settings> <Actions Context="Author"> <Exec> <Command>"C:\Program Files (x86)\messic\messic.app\messic_console.exe"</Command> <Arguments>-gui false -start</Arguments> <WorkingDirectory>C:\Program Files (x86)\messic\messic.app</WorkingDirectory> </Exec> </Actions> </Task>

Imagino que con cada ordenador los datos de las etiquetas "Author", "UserId" y "Command" deben de variar individualmente para cada instalación. En este caso, están mis datos "MiPC\ruayrod", "MiPC\ruayrod" y "C:\Program Files (x86)\messic\messic.app\messic_console.exe", respectivamente.

spheras commented 8 years ago

@ruayrod bien visto lo de messic_console.exe! jeje. Lo he puesto en la versión 1.1.0 para que sea más sencillo ver la consola aunque realmente funciona igual en messic.exe (salvo que no ves lo que devuelve el proceso por la salida estándar). (cómo te va la versión 1.1.0?)

En cuanto a lo que me indicas del script del programador de tareas, parece interesante. Creo que lo mejor sería ver la posibilidad de incluirlo en el instalador de nsis. ¿Conoces el instalador de nsis? Quizás se pueda parametrizar para incluirlo ahí como un complemente opcional. Si quieres echarle un vistazo al script de nsis te puedo indicar más o menos por dónde deberías mirar.

Gracias!!

ruayrod commented 8 years ago

Ok. Dame datos y me pongo a ello. Un placer intentar colaborar.

spheras commented 8 years ago

genial! tienes alguna experiencia con el instalador de nsis?
Aquí está lo que te hace falta para generar el instalable de nsis https://github.com/spheras/messic/tree/master/src/messic-assembly/bin/windows Yo creo que lo suyo sería crear un componente que se pudiera seleccionar o no durante la instalación de nsis, que lo que hiciera fuera de alguna manera meter ese script que indicas en windows o simplemente agregarlo como servicio de windows (algo que antiguamente se podía hacer, pero en los nuevos windows nidea!) Otra posible solución sería añadir un bat, vbs, o exe en la carpeta de instalación que añadiera el servicio.. es decir que el usuario al ejecutarlo añadiera el servicio. Esto ya no sería durante la instalación, sino post instalación y manualmente ejecutado por el usuario.

Cómo lo ves? si quieres/necesitas más detalles de nsis ya me dices. Podemos hacer un hangout o algo. bye!

ruayrod commented 8 years ago

Hola Spheras, perdona que no contestara al tema, tuve unos problemas personales que ya casi se han solventado. Ahora ando bastante liado recuperando el tiempo perdido de estos meses, por lo que tengo esto algo aparcado. No te prometo nada, pero lo intentaré en cuanto tenga tiempo para ello.

spheras commented 8 years ago

Hola @ruayrod. Sí, tranquilo. No hay prisa. Estos proyectos funcionan así, con el poco tiempo libre q tenemos. Espero q todo esté bien. Un saludo!

AlmostLook commented 7 years ago

Buenas, echando un ojo al ticket por encima :), si me pasáis el script de arranque os preparo un service para windows con sc, también se puede hacer un vbs muy sencillo con un start lo que sea, pero habría que ejecutar el vbs en el arranque.

Saludos,