Notificaciones de Windows en WSL

Con todos los avances que ha tenido el Windows Subsystem fro Linux, una de las funcionalidades que todavía sigue pendiente de implementar es el soporte para notificaciones. Esta característica que podría haberse considerado meramente estética desde la aparición de los background jobs pasó a ser una necesidad.

A menos que nos podamos permitir tener varias terminales abiertas en pantalla para monitorear cualquier proceso ejecutado en segundo plano o de forma automática, es necesario que utilicemos un sistema de información centralizado y Windows ya nos provee sus notificaciones.

El principal problema con esta idea es que no existe ningún punto de contacto entre Windows y el D-Bus.  Dada esta limitación es necesario buscar otro enfoque. La mejor opción hasta ahora viene siendo aprovechar la interoperabilidad1 entre Windows y nuestro sabor de Linux.

Para esto, necesitamos instalar BurnToast, un módulo de PowerShell que nos permite lanzar desde la línea de comandos notificaciones de Windows.

PS > Install-Module -Name BurntToast

Una vez instalado, desde probamos el funcionamiento:

PS > New-BurntToastNotification -Text "Hi There!"

En caso de que nos de error «porque la ejecución de scripts está deshabilitada en este sistema». Es necesario que habilitemos la ejecución, por lo menos, para módulos firmados:

PS > Set-ExecutionPolicy RemoteSigned

Ahora que estamos seguros que todo está listo para emitir notificaciones desde PowerShell, es hora de que hagamos pruebas desde WSL.

WSL > powershell.exe -command "New-BurntToastNotification -Text 'Hi There!'"

Finalmente, ya estamos listos para enviar notificaciones a Windows desde WSL. Además de poder elegir el texto podemos personalizar otros aspectos de las notificaciones, toda la documentación para esto está en la página del módulo.

Rendimiento de WSL

Una de las grandes features que trajo la Anniversary Update de Windows 10 es el Windows Subsystem for Linux (WSL), una compatibility layer que permite correr de forma nativa los ejecutables ELF de Linux. Si bien no está pensado para correr un X Window (aunque hay por ahí circulando guías para poder lograrlo) puede perfectamente ejecutar todas esas herramientas y servicios hoy completamente intrínsecos al desarrollo web como son los package managers, linters, test suites, étc.

Como es de esperarse cuando «virtualizamos» un SO tenemos una caída del rendimiento pero, en principio, los tiempos del WSL dejan mucho que desear. Tareas simples como actualizar un paquete con npm o procesar algunos archivos SASS puede demorar varias veces más de lo habitual, incluso varios minutos.

Con un rápido monitoreo se ve que cuando realizamos tareas en WSL se dispara el uso del procesador y del disco. Uno de los procesos que más sube su uso de los recursos del sistema es el asociado al Antimalware / Defender.  Indagando un poco en Google podemos ver que, como sucede desde la época de Vista, Windows sigue sin llevarse bien con los directorios con muchos archivos pequeños.

La filosofía de Linux de tener cientos de módulos con responsabilidades mínimas sumado al escaneo por parte de Windows de cada uno de estos archivos cuando es accedido o modificado hace que los tiempos se multipliquen.

Por lo visto, de momento la única solución posible es desactivar la protección en tiempo real de Windows Defender. La exclusión de la carpeta de datos y del ejecutable de WSL parece no alcanzar por si sola para mejorar la performance aunque probablemente tenga que ver más con que, al ejecutarse de forma nativa los programas de Linux, se nos estén pasando agregar algunos.

Una vez detenido la protección en tiempo real la performance general mejora drásticamente aunque sin llegar a ser la misma que observamos en Linux. Desde el equipo detrás de WSL prometen estar haciendo lo posible para mejorar estos tiempos pero como el problema es intrínseco al sistema de archivos no es probable que se vayan a ver soluciones definitivas en el corto plazo.