6 votos

Terminal.app y sesión de tmux, no se puede utilizar el comando "open" (sin tmux funciona)

Utilizo Terminal.app y un tmux sesión.

> open -a VLC file.mp4
The window server could not be contacted.  open must be run with a user logged in at the console, either as that user or as root.

Sin tmux este comando funciona.

Lo busqué en Google y encontré No se puede utilizar el comando 'open' en OSX tmux a partir del 10 de julio de 2015.

brew update
brew install reattach-to-user-namespace
brew upgrade reattach-to-user-namespace
echo "set -g default-command \"reattach-to-user-namespace -l ${SHELL}\"" >> ~/.tmux.conf
cat .tmux.conf 
set -g default-command "reattach-to-user-namespace -l /bin/bash"

Lo he hecho y sigo teniendo el mismo error

The window server could not be contacted.  open must be run with a user logged in at the console, either as that user or as root.

¿qué se supone que hace reattach-to-user-namespace?

13voto

Jose Chavez Puntos 645

El comando se supone que mueve el proceso tmux desde un contexto de arranque recién creado bajo el Root, al contexto de arranque de inicio de sesión del usuario.

Para explicarlo en términos un poco más comunes:

MacOS (antes OS X) está construido con un Mach-kernel en la capa más baja. Los programas que se ejecutan en esta capa se denominan tareas.

Encima del Mach-kernel está el subsistema BSD. Los programas que se ejecutan en esta capa se llaman procesos. Las aplicaciones que ejecutas y conoces en OS X (como por ejemplo tmux o Terminal.app) utilizan el subsistema BSD, por lo que al ejecutarse se convierten en procesos.

Cuando un programa en ejecución (un proceso o tarea) necesita comunicarse con otro proceso/tarea a través de un puerto Mach, pasará por la llamada tarea bootstrap. Esta tarea de muy bajo nivel es responsable de buscar las solicitudes del puerto Mach, y esencialmente dirigir la información al lugar correcto.

MacOS / OS X es esencialmente un sistema multiusuario. Varios usuarios pueden estar conectados al mismo tiempo, y cada uno puede estar ejecutando varios procesos. Por lo general, no se les permite interactuar entre sí, excepto cuando se permite explícitamente.

Además de los procesos de usuario, el sistema ejecutará en el arranque (y a veces más tarde) programas en segundo plano llamados daemons. No están asociados a un inicio de sesión de usuario específico, y siguen ejecutándose cuando los usuarios cierran la sesión.

La tarea de arranque de Mach mencionada anteriormente agrupa todas las tareas en el "contexto de inicio" para los programas daemon, o en el "contexto de inicio de sesión del usuario". Hay uno de estos últimos para cada usuario actualmente conectado.

En esencia, cuando los programas buscan los puertos de Mach para comunicarse, sólo pueden ver los puertos en su contexto actual. Cuando se inicia un programa normal, se inicia en el contexto de inicio de sesión de su usuario - y por lo tanto puede comunicarse con otros programas que ha iniciado.

Sin embargo, el proceso tmux utiliza la llamada a la función daemon() para "daemonizarse", es decir, seguir funcionando en segundo plano. Esto también tiene el efecto de mover el proceso tmux del contexto de inicio de sesión del usuario al contexto de inicio.

Ahora programas como "open" ya no funcionarán, porque funcionan buscando el puerto Mach de WindowServer para el usuario actualmente conectado, y le envía comandos para hacer su trabajo. La búsqueda fallará, ya que tmux está ahora en el contexto de arranque equivocado.

El programa reattach-to-user-namespace soluciona este problema utilizando una forma no oficial de interactuar con el proceso launchd (responsable de la gestión de los procesos daemon) - para conseguir que launchd le diga qué contexto es el contexto de inicio de sesión del usuario.

Luego utiliza la llamada al sistema de Mach task_set_bootstrap_port() para que otras miradas al puerto desde los procesos tmux (y sus procesos hijos) lleguen a la tarea bootstrap del contexto de inicio de sesión del usuario.

En cuanto a por qué no le funciona: ¿Te has acordado de matar y reiniciar tu servidor tmux después de la instalación? (hágalo ejecutando "tmux kill-server")

También podrías intentar ejecutar el comando reattach-to-user-namespace manualmente desde Terminal.app para ver si realmente lo tienes instalado y se ejecuta correctamente.

0 votos

Gran explicación. Lo que acabo de notar, sin embargo, es que open sólo se queja de algunas cosas -- por ejemplo, no hay problema al abrir un directorio (en Finder) o una URL (en el navegador por defecto, que en mi caso es Chrome). ¿A qué se debe?

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X