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

Uso Terminal.app y una tmuxsesió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 tmuxeste comando funciona.

Busqué en Google y encontré No se puede usar el comando 'abrir' en OSX tmux desde el 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 hice 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 debe hacer volver a adjuntar al espacio de nombres de usuario?

Respuestas (1)

Se supone que el comando mueve el proceso tmux desde un contexto de arranque recién creado debajo de la raíz, al contexto de arranque 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 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 denominan 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 de arranque. Esta tarea de muy bajo nivel es responsable de buscar solicitudes de puerto 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. Por lo general, no se les permite interactuar entre sí, excepto cuando se permite explícitamente.

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

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

En esencia, cuando los programas buscan puertos Mach para comunicarse, solo pueden ver 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 call daemon() para "daemonizar", 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, porque funcionan al buscar el puerto Mach de WindowServer para el usuario conectado actualmente y le envían comandos para hacer su trabajo. La búsqueda fallará, ya que tmux ahora está en el contexto de arranque incorrecto.

El programa volver a adjuntar al espacio de nombres de usuario soluciona este problema mediante el uso de una forma uoficial de interactuar con el proceso de inicio (que es responsable de administrar los procesos del demonio), para que el inicio indique qué contexto es el contexto de inicio de sesión del usuario.

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

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

También puede intentar ejecutar el comando volver a adjuntar al espacio de nombres de usuario manualmente desde Terminal.app para ver si realmente lo tiene instalado y funciona correctamente.

Gran explicación. Sin embargo, lo que acabo de notar es que opensolo se queja de algunas cosas, por ejemplo, está bien abrir un directorio (en Finder) o una URL (en el navegador predeterminado, que en mi caso es Chrome). ¿Porqué es eso?