インフラ触るときに欠かせない「tmux」について

f:id:ryoutaku_jo:20190621225717p:plain

【結論】

・「tmux」とは、端末多重化ソフトウェアと呼ばれるもので、1つのターミナル上で複数のターミナルを立ち上げて同時並行で実行できる

・リモートサーバーでtmuxを実行しておくと、セッションが切れたりインターネット接続が途切れても、すぐに作業復帰が出来る

・そのほかにも、ショートカットキーや表示といった部分をカスタマイズできる

【目次】

【本題】

「tmux」について

「tmux」とは、1つのターミナル上で複数のターミナルを立ち上げて同時並行で実行できる端末多重化ソフトウェアです。

それだけ聞くと、ターミナルのタブ機能で代替え可能な様に感じるかもしれませんが、最大のメリットはインフラを触る時にあります。

リモートサーバーの作業でtmuxを利用するメリット

AWSなどのリモートサーバーにSSHで接続すると、途中でセッションが切れる事があります。

また、何か処理の重いコマンドやスクリプトを実行している最中に、PCがスリープしたり、インターネット接続が切れてしまうと、データの不整合が発生してバグに繋がってしまう危険性もあります。

そういった問題に対処する方法として、tmuxがあります。

リモートサーバーに接続してtmuxを起動すれば、もしローカルとリモートサーバーの接続が途中で切れても、リモートサーバー上にtmuxプロセスが残るので、作業を復帰させる事が出来ます。

これにより、作業が中断される心配は無くなります。

その他にも、フロントエンドとバックエンドのビルドが分かれていたり、マイクロサービスアーキテクチャの様な複数サービスを連携させる場合に、ターミナルから複数プログラムを実行させる使い方も出来ます。

導入方法

では導入方法ですが、まずはHomebrewでtmuxをインストールします。

$ brew install tmux

そして、下記コマンドで実行できます。

$ tmux

f:id:ryoutaku_jo:20190622002739p:plain

デタッチとアタッチ

先ほど、最大のメリットとして取り上げたリモートサーバーとの再接続についてですが、簡単に操作手順をご説明します。

まず、再接続できたという事が分かりやすいように、適当にコマンドを入力しておきます。

f:id:ryoutaku_jo:20190622003014p:plain

続いて「Ctrl + b」→「d」という順にキーを入力して、tmuxとの接続を一旦終了させます。

tmuxは基本的に「Ctrl + b(prefix key)」→「任意のキー」というショートカットキーで操作を行います。

そして再接続するのは、下記のコマンドでアタッチさせます。

$ tmux attach-session

f:id:ryoutaku_jo:20190622003029p:plain

そうすると、先ほど切れたtmuxとの接続を復帰させる事が出来ます。

f:id:ryoutaku_jo:20190622003059p:plain

他にもウィンドウを複数作成する機能など便利な使い方が多いので、ぜひ活用して行きたいものです。

参考情報

tmuxを必要最低限で入門して使う - Qiita

tmux基本まとめ - Qiita

tmuxを使い始めたので基本的な機能の使い方とかを整理してみた - 完熟トマト

インフラエンジニアならtmuxを使いこなしているか!? - Goalist Developers Blog

《今日の学習進捗(3年以内に10000時間に向けて)》

ステージングや本番環境を触らせて頂く機会が増えたが、初歩的なコマンドを理解していなくて躓く場面が多々ある。環境構築以前に、せめてデプロイはサクサクと出来る様にしておきたい。バグるのが怖くてなかなか手を出せずにいたが、本格的にGitの操作をGUIからCUIに切り替えたい。

それと、今日は社内勉強会で自分の発表回だったが、課題が多く残る結果だった(テーマは、リーダブルコード)

まず、私の理解が不足している箇所が多々あり、リーダブルコードで主張されているリファクタリングの本質な考え方を上手く伝える事が出来なかった。

例えば「条件式は否定形より肯定形を使う(例→「if a != 0」より「if a == 0」を利用する)」と端的に紹介したが、これにも優先順位があり、「単純な条件」「関心を引く条件」「目立つ条件」は先に書いた方が可読性は高まるので、その場合には否定形を用いる方が有用であるが、そこまで詳しく踏み込んだ説明が出来てなかった。

それ以外にも、時間の関係で説明を大幅にすっ飛ばして、本来の意図から外れた説明になってしまい、現実的な提案では無いと思わせてしまったかもしれない。時間の制約もある中で、全てを説明しきるのは困難だが、ペース配分はもう少し練った方が良かった。

また、今回のリーダブルコードは、実践的なテクニック・ノウハウの部分だけ掻い摘む様な読み方をしていたが、他人に発表をする際に、理論部分も読み込んでおく必要があると改めて感じた(理屈を説明できない・・・)

それと進行に関しては、少しでも楽しんで貰う為に、サンプルコードを用意して、それについて意見を出し合って貰う形式を取ったが、上手く議論を盛り上げる事が出来なかった。こういった形式は、事前にテーマを明確にしておくなど、何らか工夫が必要だと感じた。

今回の発表を通して、自分はかなり理解が深まり有意義だったが、今後は参加された方にも有意義な発表が行える様に努めたい。

次に発表する時には、機械学習で簡単な事は出来る様になっている予定なので、次回はそれをテーマに発表したい。

学習開始からの期間 :196日
今日までの合計時間:1911h
一日あたりの平均学習時間:9.8h
今日までに到達すべき目標時間:1790h
目標との解離:121h
「10,000時間」まで、

残り・・・「8089時間!」