【M1 Mac】tmuxでRosetta 2環境かどうか分かるようにしたい
初めてのZenn記事になります。エンジニア見習いの拙い記事ですが、どうか温かく見守って頂けると幸いです。
対象読者
- tmuxユーザー
- M1 Macの開発環境でarm64とx86_64を頻繁に切り替える
つくった物
背景
最近M1 ProのMacbook Proを買いました。私は主にPythonやRubyをアルバイトで使っており、ライブラリがM1に対応していないプロジェクトが多数ありました。開発環境は全部Rosetta 2で統一するのが楽というのも考え方の一つと思いますが、M1でいけるプロジェクトをRosetta 2にするのも勿体ない感じがします。なので↓の記事を参考にさせて頂いて、コマンドで切り替える運用方法を取っていました。arch
やuname -m
で済む話ではありますが、せっかくtmuxを常用しているのでペインステータスにそれを表示したくなりました。
作り方
archinfoの導入
現在のシェルがどちらの環境にいるのか知るのは簡単ですが、特定のプロセスがどちらの環境で動いているのかを知るのは意外と難しいです。私が調べた限りでは、sample {PID} 1 1000 | grep 'Code Type'
と以下のarchinfoしか出てきませんでした。これより良い方法を知っている方がいたらぜひ教えてください。
sampleコマンドはMacにデフォルトで入っているのですが、癖が強く実運用上は色々と面倒そうなので今回はarchinfoを使うことにしました。
archinfoのリポジトリからソースコードをcloneして、makeでビルドします。
git clone git@github.com:hrbrmstr/archinfo.git
cd archinfo
make
出来上がったarchinfo
をどこか適当なパスの通ってる場所に置いておきます。
表示するためのシェルスクリプト
tmuxからペインのプロセスIDを知ることができるので、それを使ってarchinfoでアーキテクチャを調べます。procinfo --pid {PID}
でそのプロセスが動いているアーキテクチャが分かります。
#!/usr/bin/env zsh
if [[ $2 = "ssh" ]]; then
exit
fi
if (( $+commands[archinfo] )); then
proc_info=`archinfo --pid $1`
if [[ `echo $proc_info | grep 'arm64'` ]]; then
echo " #[bg=colour63,fg=colour255] arm64/$2 #[default]"
else
echo " #[bg=colour131,fg=colour255] x86_64/$2 #[default]"
fi
else
echo " #[bg=colour63,fg=colour255] $2 #[default]"
fi
ssh時は不要なので除外しています。tmuxでは#[bg=,fg=,option]
のような形で表示フォーマットを指定できます。tmuxで使える色はこちらが参考になりました。
実行権限をつけて適当な場所に置いておきます。
chmod 755 tmux_check_rosetta
tmuxの設定
ペインのステータス表示を設定します。今回は表示箇所をbottomにしました。
set-option -g pane-border-status bottom
set-option -g pane-border-format "#(お好みのパス/tmux_check_rosetta #{pane_pid} #{pane_current_command})"
tmux source ~/.tmux.conf
で再読み込みをすれば完成となります。ぜひ好きな見た目にカスタマイズしてみてくださいね。
Discussion