Terminal.app- und tmux-Sitzung, kann den Befehl "Öffnen" nicht verwenden (ohne tmux funktioniert es)

Ich verwende Terminal.app und eine tmuxSitzung.

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

Ohne tmuxdiesen Befehl funktioniert.

Ich habe das gegoogelt und festgestellt , dass der Befehl „Öffnen“ in OSX tmux vom 10. Juli 2015 nicht verwendet werden kann.

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"

Das habe ich gemacht und habe immer noch den gleichen Fehler

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.

Was soll Reattach-to-User-Namespace tun?

Antworten (1)

Der Befehl soll den tmux-Prozess von einem neu erstellten Bootstrap-Kontext unter dem Stamm in den Login-Bootstrap-Kontext des Benutzers verschieben.

Um das etwas gebräuchlicher zu erklären:

macOS (ehemals OS X) ist mit einem Mach-Kernel auf der untersten Schicht aufgebaut. Programme, die auf dieser Ebene ausgeführt werden, werden Tasks genannt.

Auf dem Mach-Kernel befindet sich das BSD-Subsystem. Programme, die auf dieser Ebene ausgeführt werden, werden als Prozesse bezeichnet. Die Anwendungen, die Sie unter OS X ausführen und kennen (wie zum Beispiel tmux oder Terminal.app), verwenden das BSD-Subsystem, sodass sie beim Ausführen zu Prozessen werden.

Wenn ein laufendes Programm (ein Prozess oder eine Aufgabe) mit einem anderen Prozess/einer anderen Aufgabe über einen Mach-Port kommunizieren muss, durchläuft es die sogenannte Bootstrap-Aufgabe. Diese Aufgabe auf sehr niedriger Ebene ist dafür verantwortlich, Anfragen für Mach-Ports nachzuschlagen und die Informationen im Wesentlichen an die richtige Stelle zu leiten.

macOS / OS X ist im Wesentlichen ein Mehrbenutzersystem. Mehrere Benutzer können gleichzeitig angemeldet sein und jeder kann mehrere Prozesse ausführen. Sie dürfen im Allgemeinen nicht miteinander interagieren, außer wenn dies ausdrücklich erlaubt ist.

Zusätzlich zu den Benutzerprozessen führt das System beim Booten (und manchmal später) Hintergrundprogramme aus, die Daemons genannt werden. Sie sind nicht mit einer bestimmten Benutzeranmeldung verknüpft und werden weiter ausgeführt, wenn sich Benutzer abmelden.

Die zuvor erwähnte Mach-Bootstrap-Aufgabe gruppiert alle Aufgaben entweder in den "Startkontext" für Daemon-Programme oder in den "Benutzeranmeldekontext". Letzteres gibt es für jeden aktuell eingeloggten Benutzer.

Wenn Programme nach Mach-Ports suchen, um darüber zu kommunizieren, können sie im Wesentlichen nur Ports in ihrem aktuellen Kontext sehen. Wenn Sie ein normales Programm starten, wird es im Anmeldekontext Ihres Benutzers gestartet - und Sie können so mit anderen von Ihnen gestarteten Programmen kommunizieren.

Der tmux-Prozess verwendet jedoch den Funktionsaufruf daemon(), um zu "dämonisieren", dh im Hintergrund weiterzulaufen. Dies hat auch den Effekt, dass der tmux-Prozess aus dem Anmeldekontext des Benutzers in den Startkontext verschoben wird.

Jetzt funktionieren Programme wie "open" nicht mehr, weil sie funktionieren, indem sie den Mach-Port des WindowServers nach dem aktuell angemeldeten Benutzer suchen und ihm Befehle senden, um ihre Arbeit zu erledigen. Die Suche schlägt fehl, da sich tmux jetzt im falschen Bootstrap-Kontext befindet.

Das reattach-to-user-namespace-Programm behebt dieses Problem, indem es eine uoffizielle Art der Interaktion mit dem launchd-Prozess (der für die Verwaltung von Daemon-Prozessen verantwortlich ist) verwendet – damit launchd ihm mitteilt, welcher Kontext der Anmeldekontext des Benutzers ist.

Dann verwendet es den Mach-Systemaufruf task_set_bootstrap_port(), so dass weitere Port-Looks von den tmux-Prozessen (und seinen untergeordneten Prozessen) die Bootstrap-Aufgabe des Anmeldekontexts des Benutzers treffen.

Warum es bei Ihnen nicht funktioniert: Haben Sie daran gedacht, Ihren tmux-Server nach der Installation zu beenden und neu zu starten? (tun Sie dies, indem Sie "tmux kill-server" ausführen)

Sie können auch versuchen, den Befehl reattach-to-user-namespace manuell von Terminal.app aus auszuführen, um festzustellen, ob Sie ihn wirklich installiert haben und ordnungsgemäß ausgeführt werden.

Tolle Erklärung. Was mir jedoch gerade aufgefallen ist, ist, dass es sich opennur über einige Dinge beschwert – zum Beispiel ist es in Ordnung, ein Verzeichnis (im Finder) oder eine URL (im Standardbrowser, in meinem Fall Chrome) zu öffnen. Warum das?