Corriger un bug de tmux avec launchctl sur osx

- Mac

tmux est un outil extraordinaire mais il n’est pas exempt de bugs et depuis quelques temps je l’utilise avec un bug particulièrement gênant bien qu’il ne se produise pas souvent. J’ai longtemps pesté contre iTerm2 car je pensais qu’il contenait un bug qui empêchait de lancer correctement la commande launchctl, la commande qui permet de gérer les services sur OS X (comme MySQL, nginx, …). En fait, iTerm2 n’avait rien à voir avec ce bug, le responsable n’est autre que tmux, alors voyons voir comment corriger ce problème…

Présentation du bug

launchctl n’est pas forcément un utilitaire que l’on utilise souvent sur OSX (comparé à init.d sur d’autres environnements), mais c’est quand même utile de pouvoir arreter ou redémarrer un service sur OSX.
Et justement, lorsque tmux est lancé il devient impossible de “charger” ou “décharger” un service, vous obtiendrez l’erreur suivante :

Capture du bug de launchctl avec tmux
Capture du bug de launchctl avec tmux

Certes il est possible d’ouvrir une nouvelle console sans instance tmux, mais c’est contre productif et donc une solution que je qualifierai de misère…

Qu’est ce que c’est que ce bug ?

Ce bug n’est pas nouveau et ne touche pas uniquement tmux, par exemple vim ou encore screen sont impactés par ce bug. J’avoue que je ne suis pas trop rentré dans les détails, mais que c’est un soucis lié à OSX, si vous voulez en savoir plus je vous conseille cette lecture
Heureusement il existe une solution pour remédier à ce problème de tmux.

C’est relativement simple à corriger, à condition d’avoir homebrew d’installé sur votre machine, si ce n’est pas le cas il faudra vous reporté au lien précédement mentionné dans l’article.

Pour corriger le problème, il suffit d’installer un petit binaire avec la commande suivante :

$> brew install reattach-to-user-namespace

Une fois le package installé, le bug est corrigé très simplement. Il suffit d’ajouter un alias dans son shell pour lancer d’abord le binaire que l’on vient d’installer reattach-to-user-namespace avec le nom du binaire que l’on veut exécuter, ce qui donne :

alias launchctl='reattach-to-user-namespace -l launchctl'

Et voilà, plus besoin d’utiliser une nouvelle fenêtre pour gérer ses services sur OSX…