Terminal.app y sesión tmux, no se puede usar el comando "abrir" (sin tmux funciona)

5

Uso Terminal.app y una sesión tmux .

> 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.

Busqué en Google y encontré No puedo usar el comando 'abrir' 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"

Hice eso y todavía tengo 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 debe hacer reattach-to-user-namespace?

    
pregunta Ivanov 18.06.2016 - 12:00

1 respuesta

12

Se supone que el comando mueve el proceso tmux desde un contexto de arranque recién creado bajo la raíz, al contexto de inicio de sesión del usuario.

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

macOS (anteriormente OS X) está construido con un núcleo Mach en la capa más baja. Los programas que se ejecutan en esta capa se denominan tareas.

En la parte superior del Mach-kernel está el subsistema BSD. Los programas que se ejecutan en esta capa se denominan procesos. Las aplicaciones que ejecuta y conoce en OS X (como por ejemplo tmux o Terminal.app) utilizan el subsistema BSD, por lo que cuando se ejecutan se convierten en procesos.

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

macOS / OS X es esencialmente un sistema multiusuario. Varios usuarios pueden iniciar sesión al mismo tiempo y cada uno puede ejecutar varios procesos. En 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 ocasiones más tarde) los programas de fondo llamados demonios. No están asociados con un inicio de sesión de usuario específico y se siguen ejecutando cuando los usuarios cierran sesión.

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

En esencia, cuando los programas buscan puertos de Mach para comunicarse, solo pueden ver los puertos en su contexto actual. Cuando 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 haya iniciado.

Sin embargo, el proceso tmux usa la función llamada demonio () para "desemejar", es decir, seguir ejecutándose 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, los programas como "abrir" ya no funcionarán, ya que funcionan al buscar el puerto Mach de WindowServer para el usuario que ha iniciado sesión actualmente, y envía comandos para que hagan su trabajo. La búsqueda fallará, ya que tmux ahora está en el contexto de programa de arranque incorrecto.

El programa reattach-to-user-namespace soluciona este problema utilizando una forma oficial de interactuar con el proceso launchd (que es responsable de administrar los procesos del daemon): para obtener launchd para decirle qué contexto es el contexto de inicio de sesión del usuario.

Luego, utiliza la llamada al sistema Mach task_set_bootstrap_port () para que el puerto adicional se vea desde los procesos tmux (y sus procesos secundarios) y llegue a la tarea de inicio del contexto de inicio de sesión del usuario.

En cuanto a por qué no funciona para usted: ¿Se acordó de matar y reiniciar su servidor tmux después de la instalación? (haga esto ejecutando "tmux kill-server)

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

    
respondido por el jksoegaard 18.06.2016 - 13:56

Lea otras preguntas en las etiquetas