Terminal.app e tmux session, non può usare il comando "open" (senza tmux funziona)

5

Uso Terminal.app e una sessione 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.

Senza tmux questo comando funziona.

L'ho cercato su Google e ho trovato Impossibile usare il comando 'apri' in OSX tmux dal 10 luglio 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"

L'ho fatto e ho ancora lo stesso errore

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.

che cosa dovrebbe fare lo spazio dei nomi reattach-to-user?

    
posta Ivanov 18.06.2016 - 12:00
fonte

1 risposta

12

Il comando dovrebbe spostare il processo tmux da un contesto di bootstrap appena creato sotto la root, al contesto di bootstrap di login dell'utente.

Per spiegarlo in termini leggermente più comuni:

macOS (ex OS X) è costruito con un kernel Mach al livello più basso. I programmi in esecuzione a questo livello sono chiamati compiti.

Sulla parte superiore del kernel Mach è presente il sottosistema BSD. I programmi in esecuzione a questo livello sono chiamati processi. Le applicazioni che usi e conosci su OS X (come ad esempio tmux o Terminal.app) usano il sottosistema BSD, quindi quando sono in esecuzione diventano processi.

Quando un programma in esecuzione (un processo o un'attività) deve comunicare con un altro processo / attività su una porta Mach, passerà attraverso la cosiddetta attività bootstrap. Questo compito di livello molto basso è responsabile della ricerca delle richieste per la porta Mach e essenzialmente indirizza le informazioni nel posto giusto.

macOS / OS X è essenzialmente un sistema multiutente. È possibile accedere a più utenti contemporaneamente e ciascuno può eseguire più processi. In genere non è consentito interagire tra loro, tranne quando esplicitamente consentito.

Oltre ai processi utente, il sistema eseguirà all'avvio (e talvolta in seguito) programmi in background chiamati daemon. Non sono associati a un accesso utente specifico e continuano a essere eseguiti quando gli utenti si disconnettono.

L'attività di bootstrap Mach menzionata in precedenza raggruppa tutte le attività nel "contesto di avvio" per i programmi daemon o nel "contesto di accesso dell'utente". C'è uno di questi ultimi per ogni utente attualmente loggato.

In sostanza quando i programmi cercano le porte Mach per comunicare, possono vedere solo le porte nel loro contesto attuale. Quando avvii un programma normale, viene avviato nel contesto di accesso dell'utente, quindi puoi comunicare con altri programmi che hai avviato.

Il processo tmux tuttavia usa la funzione daemon () per "demonizzare" - cioè continua a funzionare in background. Ciò ha anche l'effetto di spostare il processo tmux dal contesto di accesso dell'utente al contesto di avvio.

Ora programmi come "open" non funzioneranno più, perché funzionano guardando la porta Mach di WindowServer per l'utente attualmente connesso, e inviano comandi per fare il loro lavoro. La ricerca fallirà, dato che tmux ora si trova nel contesto di bootstrap sbagliato.

Il programma per lo spazio dei nomi riattaccare-per-utente risolve questo problema usando un modo uofficial di interagire con il processo launchd (che è responsabile della gestione dei processi demone) - per ottenere launchd per dire quale contesto è il contesto di accesso dell'utente.

Quindi usa la chiamata di sistema Mach task_set_bootstrap_port () in modo che ulteriori analisi delle porte dai processi tmux (e dai suoi processi figli) colpiranno l'attività di bootstrap del contesto di login dell'utente.

Perché non funziona per te: ti sei ricordato di uccidere e riavviare il tuo server tmux dopo l'installazione? (esegui "tmux kill-server)

Potresti anche provare a eseguire manualmente il comando riattacca lo spazio dei nomi utente da Terminal.app per vedere se hai davvero installato e funziona correttamente.

    
risposta data 18.06.2016 - 13:56
fonte

Leggi altre domande sui tag