103.5 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
103 GNUおよびUnixコマンド |
Objective: |
103.5 プロセスの作成、監視、強制終了 |
Lesson: |
2 of 2 |
はじめに
前のレッスンではプロセス監視のためのツールとユーティリティを紹介しました。システム管理者はもう一歩先に進もうとすることもあるでしょう。このレッスンでは、ターミナルマルチプレクサという概念を紹介し、GNU Screen と tmux を取り上げます。今日では、素晴らしいターミナルエミュレータがいろいろありますが、ターミナルマルチプレクサは今なお生産的なシステム管理者のための強力な特徴を備えています。
ターミナルマルチプレクサの特徴
電子工学の分野では、マルチプレクサ(短く mux と表現することもあります)とは複数の入力を一つの出力に結びつける装置のことです。ターミナルマルチプレクサを使うと、必要に応じて複数の入力を切り替えることができます。ターミナルマルチプレクサである screen
と tmux
には、似た機能が備わっています。
-
起動するとセッションが開始されます。セッションはウィンドウを持ち、ウィンドウ内でプログラムを実行します。
-
ウィンドウはリージョンやペインに分割できます。複数のプログラムを同時に実行するときにこれが役立ちます。
-
コマンドプレフィックス や コマンドキー と呼ばれるキーの組み合わせでコマンドを実行できるので、管理がしやすいです。
-
セッションはターミナルからデタッチ(切り離し)できます(プログラムがバックグラウンドに送られて実行され続けます)。そうすると、間違ってターミナルが閉じられたり、固まったり、リモート接続が失われたりしても、プログラムが最後まで実行されます。
-
ソケット接続。
-
コピーモード。
-
カスタマイズ可能。
GNU Screen
初期Unix時代(1970年代から80年代)のコンピュータは、1台の中央コンピュータに複数の端末(訳注:英数字を表示するためのブラウン管とキーボードがセットになった装置で、VT100が代表的)が接続しているものでした。ウィンドウやタブなんてありません。1987年にGNU Screenが開発された背景にはこうした事情がありました。1台の物理的な端末で複数の画面をエミュレートしようとしたのです。
ウィンドウ
GNU Screenは、端末に screen
と入力するだけで起動できます(訳注:起動しない場合はパッケージマネージャからインストールしてください)。次のようなウェルカムメッセージが表示されます。
GNU Screen version 4.05.00 (GNU) 10-Dec-16 Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury Copyright (c) 1993-2002, 2003, 2005, 2006, 2007 Juergen Weigert, Michael Schroeder Copyright (c) 1987 Oliver Laumann (...)
スペースキーかエンターキーを押してメッセージを閉じると、コマンドプロンプトが表示されます。
$
何も起こらなかったように見えるかもしれませんが、実はもう screen
が起動してセッションとウィンドウを管理しています。コマンドプレフィックスはCtrl+aです。Ctrl+a-wと入力すると、ターミナルの最下部にウィンドウ一覧が表示されます。
0*$ bash
ウィンドウは1つしかありませんね。数字は0番から始まることに注意してください。別のウィンドウを立ち上げるには、Ctrl+a-cと入力してください。新しいプロンプトが表示されます。ps
を実行してみましょう。
$ ps PID TTY TIME CMD 974 pts/2 00:00:00 bash 981 pts/2 00:00:00 ps
もう一度Ctrl+a-wと入力してみましょう。
0-$ bash 1*$ bash
今度は2つのウィンドウがありますね(アスタリスクは現在のウィンドウを示しています)。どちらもBashから開始されたウィンドウなので、名前は両方ともbashです。現在のウィンドウでは ps
を実行したので、現在のウィンドウを ps
という名前にしてみましょう。Ctrl+a-Aと入力し、プロンプトに新しいウィンドウの名前(ps
)を入力してください。
Set window's title to: ps
次に、もう一つ新しいウィンドウを作りましょう。今回は最初から yetanotherwindow
と名前を付けます。screen
に -t
オプションを指定します。
$ screen -t yetanotherwindow
ウィンドウを移動するにはいくつかやり方があります。
-
Ctrl+a-nで次の(next)ウィンドウ、Ctrl+a-pで前の(previous)ウィンドウに移動できます。
-
Ctrl+a-数字でその番号(数字)のウィンドウに移動できます。
-
Ctrl+a-"ですべてのウィンドウのリストを見ることができます。矢印キーの上と下でウィンドウを選んでエンターキーを押すと移動できます。
Num Name Flags 0 bash $ 1 ps $ 2 yetanotherwindow
ウィンドウに関しては、以下の事柄が重要です。
-
ウィンドウはそれぞれ独立してプログラム(通常はシェル)を実行します。
-
ウィンドウが見えない状態であってもプログラムは実行され続けます(後述のように、セッションがデタッチされたときも同様にプログラムが実行され続けます)。
ウィンドウを開始する際に実行したプログラム(bash)が終了するとウィンドウが削除されます。ウィンドウがすべて削除されると screen
自体が終了します。Ctrl+a-kと入力しても現在のウィンドウが削除されます。この場合、(シェルがまだ実行されていますから)確認を求められます。
Really kill this window [y/n] Window 0 (bash) killed.
リージョン
screen
では1つのターミナルを複数のリージョンに分けることができます。それぞれのリージョンがウィンドウを持ちます。リージョンは、水平方向(Ctrl+a-S)にも、垂直方向(Ctrl+a-| 縦棒)にも分割できます。
新しいリージョンには --
とだけ表示されます。
1 ps --
新しいリージョンに移動するには、Ctrl+a-Tabと入力してください。先ほど紹介したやり方で新しいリージョンにウィンドウを追加できます。例えば、Ctrl+a-2と入力すると、 --
が 2yetanotherwindow
に変化します。
$ ps $ PID TTY TIME CMD 1020 pts/2 00:00:00 bash 1033 pts/2 00:00:00 ps $ screen -t yetanotherwindow 1 ps 2 yetanotherwindow
リージョンに関して重要な事柄は次のとおりです。
-
Ctrl+a-Tabでリージョンを移動します。
-
Ctrl+a-Qで現在のリージョン以外のすべてのリージョンを終了します。
-
Ctrl+a-Xで現在のリージョンを終了します。
-
リージョンを終了してもそのリージョンに関連付けられたウィンドウは終了しません。
セッション
ここまでにウィンドウとリージョンを説明しましたが、いずれも一つのセッションに属していました。次はセッションを説明しましょう。すべてのセッションを確認するには、screen -list
か screen -ls
と入力します。
$ screen -list There is a screen on: 1037.pts-0.debian (08/24/19 13:53:35) (Attached) 1 Socket in /run/screen/S-carol.
ここまでのところではセッションが一つしかありませんね。
- PID
-
1037
- 名前
-
pts-0.debian
(ターミナル(この例ではセッション名を指定していないので、使用している 疑似端末 名)とホスト名を示しています)。 - ステータス
-
Attached
わかりやすい名前を付けて新しいセッションを開始してみましょう。
$ screen -S "second session"
端末の表示がクリアされて新しいプロンプトが始まります。セッションをもう一度確認してみましょう。(訳注:自分がどのセッションに居るのかを調べるには、echo $STY
コマンドを使います。)
$ screen -ls There are screens on: 1090.second session (08/24/19 14:38:35) (Attached) 1037.pts-0.debian (08/24/19 13:53:36) (Attached) 2 Sockets in /run/screen/S-carol.
セッションを終了するには、そのセッションのすべてのウィンドウを終了させるか、screen -S セッションのPID -X quit
コマンドを実行します。セッションのPIDのかわりにセッション名でも構いません。1つ目のセッションを閉じてみましょう。
$ screen -S 1037 -X quit
screen
の外側のターミナルプロンプトに戻されます。それでも先ほど作成した2つ目のセッションは生きています。
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Detached) 1 Socket in /run/screen/S-carol.
親セッションを終了したので、ラベルが Detached
に変わりました。
セッションのデタッチ
端末からセッションをデタッチしたい場面があります。
-
職場のコンピュータに作業させておき、後で家からリモート接続する場面。
-
他のユーザーとセッションを共有する場面。
Ctrl+a-dでセッションをデタッチします。screen
の外側のターミナルプロンプトに戻されます。(訳注:デタッチした後にシステムからログアウトしても、セッションは動き続けます。同じ端末、あるいは異なる端末からログインして、既存のセッションにアタッチできます)。
[detached from 1090.second session] $
screen -r セッションのPID
コマンドでセッションをアタッチできます。セッションのPID
のかわりに セッション名
でも構いません。セッションが1つしかない場合は、screen -r
だけでもアタッチできます。
$ screen -r
1つ目のセッションを終了して、2つ目のセッションしか残っていないので、このコマンドだけでアタッチできます。
$ screen -ls There is a screen on: 1090.second session (08/24/19 14:38:35) (Attached) 1 Socket in /run/screen/S-carol.
セッションのアタッチに関しては、以下のオプションがあります。
-d -r
-
セッションを(必要があれば)デタッチしてから、指定のセッションに再アタッチします。
-d -R
-
必要があればセッションを作成してから、セッションにアタッチします(
-d -r
と同様)。 -d -RR
-
-d -R
と同じ。ただし、複数のセッションにアタッチできる場合には、最初のセッションにアタッチします。 -D -r
-
セッションが稼働中であれば、そこからデタッチとログアウトさせてからアタッチします。
-D -R
-
セッションが稼働中の場合は
-D -r
と同じ。実行中でない場合は、セッションを作成してユーザーに通知します。 -D -RR
-
-D -R
と同じ(既存のセッションにとにかくアタッチしたいときなどに便利です)。 -d -m
-
デタッチモード で
screen
を起動します。新しいセッションを作成しますがアタッチしません。シェルの起動スクリプトなどで使用すると便利です。 -D -m
-
-d -m
と同じですが、新しいプロセスをフォークしません。セッションが終了したらこのコマンドを呼び出したプロセスも終了します。
他のオプションについては screen
のマニュアルを参照してください。
コピーアンドペースト:スクロールバックモード
GNU Screenは、コピーモード(スクロールバックモード)を備えています。矢印キーでカーソルを動かして現在のウィンドウのコマンド履歴を遡れます。テキストのコピーもできます。手順は次のとおりです。
-
Ctrl+a-[でコピーモード(スクロールバックモード)に入ります。
-
矢印キーでコピーしたいテキストの先頭まで移動します。
-
スペースキーでコピーしたいテキストの先頭にマークをつけます。
-
矢印キーでコピーしたいテキストの末尾に移動します。
-
スペースキーでコピーしたいテキストの末尾にマークをつけます。
-
ペーストしたいウィンドウに移動し、Ctrl+a-]でペーストします。
screenのカスタマイズ
screen
のシステム全体の設定ファイルは /etc/screenrc
です。ユーザーレベルの設定ファイルは ~/.screenrc
です。設定ファイルは、4つの大きなセクションに分かれています。
SCREEN SETTINGS
-
一般的な設定です。
defscrollback 1024
のように、ディレクティブ の後に半角スペースを入れて 値 を設定します。 SCREEN KEYBINDINGS
-
キーバインドを再定義できます。ここで再定義すると、いつものように端末が使えなくなるかもしれないので注意してください。
bind
の後に半角スペースを入れてコマンドプレフィックスの後に入力するキーを書き、さらに半角スペースを入れてコマンドを書きます。bind l kill
といった具合です。このように再定義すると、ウィンドウを削除するには、デフォルトのCtrl+a-kではなく、Ctrl+a-lと入力することになります。screen
のキーバインド一覧は、Ctrl+a-?と入力するかマニュアルで確認してください。Tipコマンドプレフィックス自体を変更することもできます。Ctrl+aからCtrl+bに変更するには、
escape ^Bb
という行を追記してください。 TERMINAL SETTINGS
-
このセクションでは、端末のウィンドウサイズやバッファなどを設定します。例えば、ノンブロッキングモードを有効にするには、
defnonblock 5
と設定します。 STARTUP SCREENS
-
screen
の起動時に実行されるコマンドを指定します。screen -t top top
と設定すると、top
という名前でtop
を実行するウィンドウが開きます。
tmux
tmux
は2007年にリリースされました。screen
とよく似ていますが、いくつか違いがあります。
-
クライアントサーバーモデル。サーバーが複数のセッションを持ち、それぞれのセッションが複数のウィンドウを持ち、ウィンドウは複数のペインに分割できます。
-
セッション、ウィンドウをメニューで対話的に選べます。
-
同じウィンドウを複数のセッションに紐付けできます。
-
vim と Emacs の両方のキーレイアウトを利用できます。(ここではデフォルトの Emacs モードのキー操作を説明します)。
-
UTF-8と256色の端末をサポートします。
ウィンドウ
ターミナルで tmux
と入力するだけで起動できます。起動するとシェルのプロンプトとウィンドウの下部にステータスバーが表示されます。
[0] 0:bash* "debian" 18:53 27-Aug-19
ステータスバーには、ホスト名、日時に加えて、以下の情報が表示されます。
- セッション名
-
[0]
- ウィンドウ番号
-
0:
- ウィンドウ名
-
bash*
。デフォルトではウィンドウ内で実行されているプログラムの名前です。screen
とは違い、tmux
は現在実行しているプログラムを自動的にウィンドウ名に反映します。アスタリスクは現在見えているウィンドウです。
セッション名とウィンドウ名を指定して tmux
を起動することもできます。
$ tmux new -s "LPI" -n "Window zero"
指定したセッション名とウィンドウ名に応じてステータスバーの表示が変わります。
[LPI] 0:Window zero* "debian" 19:01 27-Aug-19
tmux
のコマンドプレフィックスはCtrl+bです。Ctrl+b-cと入力すると新しいウィンドウが作成されます。新しいプロンプトが表示され、ステータスバーのウィンドウ名の部分が変わります。
[LPI] 0:Window zero- 1:bash* "debian" 19:02 27-Aug-19
シェルはbashなので、新しいウィンドウにはbashという名前がデフォルトで付けられます。top
を起動して、ウィンドウ名が top
に変わることを確かめてみます。
[LPI] 0:Window zero- 1:top* "debian" 19:03 27-Aug-19
Ctrl+b-,(カンマ)でウィンドウ名を変更することもできます。新しいウィンドウ名の入力を求められるので、名前を入力してエンターキーを押します。
(rename-window) Window one
Ctrl+b-wを押すとすべてのウィンドウが表示されます。矢印キーの上と下でウィンドウを選択してエンターキーを押すとそのウィンドウに移動できます。
(0) 0: Window zero- "debian" (1) 1: Window one* "debian"
screen
と同じように、以下のやり方でウィンドウを移動することもできます。
- Ctrl+b-n
-
次の(next)ウィンドウに移動します。
- Ctrl+b-p
-
前の(previous)ウィンドウに移動します。
- Ctrl+b-数字
-
その番号(数字)のウィンドウに移動します。
Ctrl+b-&でウィンドウを削除できます。確認を求められます。
kill-window Window one? (y/n)
他には次のようなコマンドがあります。
- Ctrl+b-f
-
名前でウィンドウを検索します。
- Ctrl+b-.
-
ウィンドウ番号を変更します。
その他のコマンドについてはマニュアルか、Ctrl+b-? で表示されるヘルプを参照してください。
ペイン
tmux
でも screen
と同じようにウィンドウを分割できます。ウィンドウを分割した部分を、screen
ではリージョンと呼びましたが、tmux
ではペインと呼びます。ペインはリージョンとは異なりウィンドウと連動している疑似端末です。ペインを終了するとその中で実行されているプログラムも終了します。
Ctrl+b-"で水平方向にウィンドウを分割します。
Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 4050960 total, 3730920 free, 114880 used, 205160 buff/cache KiB Swap: 4192252 total, 4192252 free, 0 used. 3716004 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1340 carol 20 0 44876 3400 2800 R 0.3 0.1 0:00.24 top 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 $ ─────────────────────────────────────────────────────────────────────────────────────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Ctrl+b-%で垂直方向にウィンドウを分割します。
│$ 1 root 20 0 139088 6988 5264 S 0.0 0.2 0:00.50 systemd │ │ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd │ │ 3 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/0 │ 4 root 20 0 0 0 0 S 0.0 0.0 0:01.62 kworker/0:0 │ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H│ 7 root 20 0 0 0 0 S 0.0 0.0 0:00.06 rcu_sched │ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh │ 9 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 │ │ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drai│ n │ 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 watchdog/0 │ │ 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 │ │ $ │ ───────────────────────────────────────────────────────────────────────────────┴─────────────── $ [LPI] 0:Window zero- 1:Window one* "debian" 19:05 27-Aug-19
Ctrl+b-xで現在のペインを(疑似端末やそこで実行されているプログラムとともに)破棄します。ステータスバーで確認を求められます。
kill-pane 1? (y/n)
よく使うペインの操作コマンドを以下に示します。
- Ctrl+b-↑,↓,←,→
-
ペインを移動します。
- Ctrl+b-;
-
直前にアクティブだったペインに移動します。
- Ctrl+b-Ctrl+矢印キー
-
ペインのサイズを1行分変更します。
- Ctrl+b-Alt+矢印キー
-
ペインのサイズを5行分変更します。
- Ctrl+b-{
-
現在のペインと1つ前のペインを入れ替えます。
- Ctrl+b-}
-
現在のペインと1つ後のペインを入れ替えます。
- Ctrl+b-z
-
パネルのズームインとズームアウトを切り替えます。
- Ctrl+b-t
-
ペイン内に時計を表示します(
q
で非表示にできます)。 - Ctrl+b-!
-
ペインをウィンドウにします。
その他のコマンドについてはマニュアルか、Ctrl+b-? で表示されるヘルプを参照してください。
セッション
Ctrl+b-sで tmux
のセッションのリストを表示できます。
(0) + LPI: 2 windows (attached)
tmux ls
コマンドでもセッションのリストを表示できます。
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39] (attached)
セッションは1つしかなく(LPI
)、そのセッションが2つのウィンドウを持っています。新しいセッションを作ってみましょう。Ctrl+bの後に :new
と入力してエンターキーを押してください。新しいセッションに移行します。そのことはステータスバーで示されています。
[2] 0:bash* "debian" 19:15 27-Aug-19
デフォルトでは 2
というセッション名になります。Ctrl+b-$でセッション名を変更できます。入力を求められたら、新しいセッション名を入力して、エンターキーを押します。
(rename-session) Second Session
Ctrl+b-sでセッションを切り替えられます(矢印キーで選んでエンターキーを押してください)。
(0) + LPI: 2 windows (1) + Second Session: 1 windows (attached)
セッションを終了するには、tmux kill-session -t セッション名
というコマンドを使います。このコマンドで現在のセッションを終了すると、tmux
のセッションから tmux
を起動した元のターミナルのセッションに戻されます。
$ tmux kill-session -t "Second Session" [exited] $
セッションのデタッチ
Second Session
を終了すると tmux
の外側に戻されました。しかし、アクティブなセッションが残っています。以下のコマンドを実行すると、確かにセッションがありますね。
$ tmux ls LPI: 2 windows (created Tue Aug 27 19:01:49 2019) [158x39]
このセッションはターミナルからデタッチされています。tmux attach -t セッション名
でアタッチできます(attach
のかわりに at
や a
という省略形も使えます)。セッションが1つしかなければ、名前の指定は不要です。
$ tmux a
セッションに戻りました。Ctrl+b-dでデタッチします。
[detached (from session LPI)] $
Tip
|
|
セッションのアタッチとデタッチに関しては次のコマンドがあります。
- Ctrl+b-D
-
デタッチするクライアントを選択します。
- Ctrl+b-r
-
クライアントの端末を再描画します。
その他のコマンドについてはマニュアルか、Ctrl+b-? で表示されるヘルプを参照してください。
コピーアンドペースト:スクロールバックモード
tmux
にもコピーモードがあり、screen
と基本的には同じです(tmux
のコマンドプレフィックスはCtrl+bで screen
のコマンドプレフィックスCtrl+aとは異なることに留意してください)。Ctrl+spaceで開始点のマーク、Alt+wで選択したテキストをコピーするという点が、screen
とは異なります。(viモードではキー操作が異なります。)
tmuxのカスタマイズ
tmux
の設定ファイルは /etc/tmux.conf
と ~/.tmux.conf
です。tmux
の起動時にこれらのファイルがあれば読み込まれます。-f
オプションを使うとこれらのファイルとは別の設定ファイルを読み込めます。/usr/share/doc/tmux/example_tmux.conf
に設定ファイルの例があります。カスタマイズ性が高いです。例えば以下のような設定ができます。
-
コマンドプレフィックスのキーを変更します。
# Change the prefix key to C-a set -g prefix C-a unbind C-b bind C-a send-prefix
-
ウィンドウ番号が10以上のウィンドウに切り替えるためのキーバインドを追加します。
# Some extra key bindings to select higher numbered windows bind F1 selectw -t:10 bind F2 selectw -t:11 bind F3 selectw -t:12
キーバインドのリストはCtrl+b-?で確認できます(q
を押すと終了します)。マニュアルにも載っています。
演習
-
次の特徴は、
screen
かtmux
のどちらに当てはまりますか。両方に当てはまるものもあります。特徴 GNU Screen tmux デフォルトのコマンドプレフィックスはCtrl+a
クライアントサーバーモデル
ペインは疑似端末
リージョンを終了してもウィンドウは終了しない
セッションがウィンドウを持つ
セッションをデタッチできる
-
GNU Screenをインストールして(パッケージ名は
screen
です)、次の課題に取り組んでください。-
screen
を開始してください。 -
top
を起動してください。 -
コマンドプレフィックスで新しいウィンドウを開き、
vi
で/etc/screenrc
を開いてください。 -
ターミナルの下部にウィンドウのリストを表示させてください。
-
現在のウィンドウ名を
vi
に変更してください。 -
残っているもう1つウィンドウの名前を
top
に変更してください。まずウィンドウのリストを表示し、名前を変更するウィンドウを選択します。 -
もう一度ターミナルの下部にウィンドウ名を表示して、ウィンドウ名が変更できていることを確かめてください。
-
セッションをデタッチして、
ssh
という名前の新しいセッションを作成してください。 -
ssh
という名前のセッションもデタッチして、セッションのリストを表示してください。 -
PIDを指定して最初のセッションをアタッチしてください。
-
top
を表示しているウィンドウに戻ってくるはずです。ウィンドウを水平方向に分割して、新しい空白のリージョンに移動してください。 -
ウィンドウのリストを表示し、
vi
という名前のウィンドウを選んで、先ほど新しく作った空白のリージョンに表示されるようにしてください。 -
現在のリージョンを垂直方向に分割し、新しく作られた空白のリージョンに移動してください。そして、新しいウィンドウをそのリージョンで作ってください。
-
現在のリージョン以外のリージョンをすべて終了してください(リージョンを終了してもウィンドウは終了しません)。次に、すべてのウィンドウを終了してください。そうするとようやくセッションが終了します。
-
最後にセッションのリストを確認します。PIDを指定して
ssh
という名前のセッションを終了し、セッションがもう残っていないことを確認してください。
-
-
tmux
をインストールして(パッケージ名はtmux
です)、次の課題に取り組んでください。-
tmux
を開始してください。 -
top
を起動してください(数秒でステータスバーのウィンドウの名前がtop
に変わることに注目してください)。 -
コマンドプレフィックスで新しいウィンドウを開き、
nano
で~/.tmux.conf
を作成してください。 -
ウィンドウを水平方向に分割し、新しく作成したペインのサイズを少し小さくしてください。
-
現在のウィンドウの名前を
text editing
に変更し、tmux
のセッションのリストを表示してください。 -
同じコマンドを2回入力して、1回目で
top
を実行しているウィンドウに移動し、2回目で現在のウィンドウに戻ってください。 -
現在のセッションをデタッチして、セッション名が
ssh
、ウィンドウ名がssh window
の新しいセッションを作成してください。 -
ssh
という名前のセッションもデタッチして、tmux
のセッションのリストを表示してください。Noteここからはリモートマシンからローカルマシンに
ssh
接続することが必要になります(仮想マシンを使ったリモート接続でも大丈夫です)。ローカルマシンでopenssh-server
をインストールして起動させ、リモートマシンでopenssh-client
をインストールしてください。 -
リモートマシンからローカルマシンに
ssh
接続してください。接続を確立できたらtmux
のセッションを確認してください。 -
リモートマシンから
ssh
という名前のセッションにアタッチしてください。 -
ローカルマシンに戻り、
ssh
という名前のセッションをアタッチします。リモートホストとの接続を終了してからアタッチするコマンドを入力してください。 -
すべてのセッションを表示し、最初のセッション(
[0]
)に移動します。移動後にssh
という名前のセッションを終了してください。 -
最後に、現在のセッションをデタッチして、そのセッションを終了します。
-
発展演習
-
screen
でもtmux
でもコマンドプレフィックスに続けて:(コロン)を入力するとコマンドラインモードになります(tmux
での簡単な例はすでに見ました)。コマンドラインモードで次の課題に取り組んでください。-
screen
でコピーモードに入ってください。 -
tmux
で現在のウィンドウの名前を変更してください。 -
screen
でですべてのウィンドウを閉じてセッションを終了してください。 -
tmux
でペインを分割してください。 -
tmux
で現在のウィンドウを終了してください。
-
-
screen
でコピーモードに入ると、矢印キーやPgUP、PgDownキーで現在のウィンドウを遡れますが、vi
風のフルスクリーンエディタを使うこともできます。次の課題に取り組んでください。-
screen
の端末でsupercalifragilisticexpialidocious
と出力してください。 -
カーソルの真上にある5つの連続する文字をコピーしてください。
-
選択した部分(筆者の環境では
stice
の5文字になりました)をコマンドプロンプトにペーストしてください。
-
-
tmux
のセッション(our_session
)を別のユーザーと共有します。相手のユーザーも読み書きできるパーミッションでソケット(/tmp/our_socket
)は作ってあります。相手のユーザーがtmux -S /tmp/our_socket a -t our_session
でセッションをアタッチできるようにするには、あと2つしなければならないことがあります。それは何でしょう?
まとめ
このレッスンでは、ターミナルマルチプレクサという一般的な概念と、GNU Screenとtmuxという具体的なツールについて学びました。次の事柄が重要です。
-
コマンドプレフィックス(
screen
ではCtrl+a 、tmux
ではCtrl+b) -
セッション、ウィンドウ、ウィンドウの分割(リージョンまたはペイン)
-
コピーモード
-
セッションのデタッチ
このレッスンでは以下のコマンドを使用しました:
screen
-
screen
のセッションを開始します。 tmux
-
tmux
のセッションを開始します。
演習の解答
-
次の特徴は、
screen
かtmux
のどちらに当てはまりますか。両方に当てはまるものもあります。特徴 GNU Screen tmux デフォルトのコマンドプレフィックスはCtrl+a
x
クライアントサーバーモデル
x
ペインは疑似端末
x
リージョンを終了してもウィンドウは終了しない
x
セッションがウィンドウを持つ
x
x
セッションをデタッチできる
x
x
-
GNU Screenをインストールして(パッケージ名は
screen
です)、次の課題に取り組んでください。-
screen
を開始してください。screen
-
top
を起動してください。top
-
コマンドプレフィックスで新しいウィンドウを開き、
vi
で/etc/screenrc
を開いてください。Ctrl+a-c
sudo vi /etc/screenrc
-
ターミナルの下部にウィンドウのリストを表示させてください。
Ctrl+a-w
-
現在のウィンドウ名を
vi
に変更してください。Ctrl+a-Aを押してから、
vi
と入力してエンターキーを押します。 -
残っているもう1つウィンドウの名前を
top
に変更してください。まずウィンドウのリストを表示し、名前を変更するウィンドウを選択します。Ctrl+a-"を押し、矢印キーで
0 bash
と表示されているものを選んでエンターキーを押します。それからCtrl+a-Aを押し、top
と入力してエンターキーを押します。 -
もう一度ターミナルの下部にウィンドウ名を表示して、ウィンドウ名が変更できていることを確かめてください。
Ctrl+a-w
-
セッションをデタッチして、
ssh
という名前の新しいセッションを作成してください。Ctrl+a-d
screen -S "ssh"
-
ssh
という名前のセッションもデタッチして、セッションのリストを表示してください。Ctrl+a-d
screen -list
またはscreen -ls
-
PIDを指定して最初のセッションをアタッチしてください。
screen -r セッションのPID
-
top
を表示しているウィンドウに戻ってくるはずです。ウィンドウを水平方向に分割して、新しい空白のリージョンに移動してください。Ctrl+a-S
Ctrl+a-Tab
-
ウィンドウのリストを表示し、
vi
という名前のウィンドウを選んで、先ほど新しく作った空白のリージョンに表示されるようにしてください。Ctrl+a-"ですべてのウィンドウを表示し、
vi
を選んでエンターキーを押します。 -
現在のリージョンを垂直方向に分割し、新しく作られた空白のリージョンに移動してください。そして、新しいウィンドウをそのリージョンで作ってください。
Ctrl+a-|
Ctrl+a-Tab
Ctrl+a-c
-
現在のリージョン以外のリージョンをすべて終了してください(リージョンを終了してもウィンドウは終了しません)。次に、すべてのウィンドウを終了してください。そうするとようやくセッションが終了します。
Ctrl+a-Q
exit
(Bashを終了)Shift+:と押した後に
quit
と入力しエンターキーを押す(vi
を終了)exit
(Bashを終了)q
(top
を終了)exit
(Bashを終了)。 -
最後にセッションのリストを確認します。PIDを指定して
ssh
という名前のセッションを終了し、セッションがもう残っていないことを確認してください。screen -list
またはscreen -ls
screen -S セッションのPID -X quit
screen -list
またはscreen -ls
-
-
tmux
をインストールして(パッケージ名はtmux
です)、次の課題に取り組んでください。-
tmux
を開始してください。tmux
-
top
を起動してください(数秒でステータスバーのウィンドウの名前がtop
に変わることに注目してください)。top
-
コマンドプレフィックスで新しいウィンドウを開き、
nano
で~/.tmux.conf
を作成してください。Ctrl+b-c
nano ~/.tmux.conf
-
ウィンドウを水平方向に分割し、新しく作成したペインのサイズを少し小さくしてください。
Ctrl+b-"
Ctrl+b-Ctrl+↓
-
現在のウィンドウの名前を
text editing
に変更し、tmux
のセッションのリストを表示してください。Ctrl+b-,を押してから新しい名前(
text editing
)を入力してエンターキーを押しますCtrl+b-s または
tmux ls
-
同じコマンドを2回入力して、1回目で
top
を実行しているウィンドウに移動し、2回目で現在のウィンドウに戻ってください。Ctrl+b-n または Ctrl+b-p
-
現在のセッションをデタッチして、セッション名が
ssh
、ウィンドウ名がssh window
の新しいセッションを作成してください。Ctrl+b-d
tmux new -s "ssh" -n "ssh window"
-
ssh
という名前のセッションもデタッチして、tmux
のセッションのリストを表示してください。Ctrl+b-d
tmux ls
Noteここからはリモートマシンからローカルマシンに
ssh
接続することが必要になります(仮想マシンを使ったリモート接続でも大丈夫です)。ローカルマシンでopenssh-server
をインストールして起動させ、リモートマシンでopenssh-client
をインストールしてください。 -
リモートマシンからローカルマシンに
ssh
接続してください。接続を確立できたらtmux
のセッションを確認してください。リモートホストで
ssh ユーザー名@ローカルマシンのIPアドレス
を実行します。ローカルマシンに接続したらtmux ls
を実行します。 -
リモートマシンで
ssh
という名前のセッションをアタッチしてください。tmux a -t ssh
(a
はat
またはattach
でも可) -
ローカルマシンに戻り、
ssh
という名前のセッションにアタッチします。リモートホストとの接続を終了してからアタッチするコマンドを入力してください。tmux a -d -t ssh
(a
はat
またはattach
でも可) -
すべてのセッションを表示し、最初のセッション(
[0]
)に移動します。移動後にssh
という名前のセッションを終了してください。Ctrl+b-sを押し、矢印キーでセッション
0
を選んでエンターキーを押します。それからtmux kill-session -t ssh
を実行します。 -
最後に、現在のセッションをデタッチして、そのセッションを終了します。
Ctrl+b-d
tmux kill-session -t 0
-
発展演習の解答
-
screen
でもtmux
でもコマンドプレフィックスに続けて:(コロン)を入力するとコマンドラインモードになります(tmux
での簡単な例はすでに見ました)。コマンドラインモードで次の課題に取り組んでください。-
screen
でコピーモードに入ってください。Ctrl+a-:を押してから
copy
と入力します。 -
tmux
で現在のウィンドウの名前を変更してください。Ctrl+b-:を押してから
rename-window
と入力します。 -
screen
ですべてのウィンドウを閉じてセッションを終了してください。Ctrl+a-:を押してから
quit
と入力します。 -
tmux
でペインを分割してください。Ctrl+b-:を押してから
split-window
と入力します。 -
tmux
で現在のウィンドウを終了してください。Ctrl+b-:を押してから
kill-window
と入力します。
-
-
screen
でコピーモードに入ると、矢印キーやPgUP、PgDownキーで現在のウィンドウを遡れますが、vi
風のフルスクリーンエディタを使うこともできます。次の課題に取り組んでください。-
screen
の端末でsupercalifragilisticexpialidocious
と出力してください。echo supercalifragilisticexpialidocious
-
カーソルの真上にある5つの連続する文字をコピーしてください。
Ctrl+a-[と押すか、Ctrl+a-:を押した後に
copy
と入力して、コピーモードに入ります。 次に、k
を押して上の行に移動し、スペースキーを押して選択する部分の先頭にマークをつけます。最後に、l
を4回押して4文字前に進み、スペースキーをもう一度押して選択する部分の末尾にマークをつけます。 -
選択した部分(筆者の環境では
stice
の5文字になりました)をコマンドプロンプトにペーストしてください。Ctrl+a-]
-
-
tmux
のセッション(our_session
)を別のユーザーと共有します。相手のユーザーも読み書きできるパーミッションでソケット(/tmp/our_socket
)を作ってあります。相手のユーザーがtmux -S /tmp/our_socket a -t our_session
でセッションをアタッチできるようにするには、あと2つしなければならないことがあります。それは何でしょう?両方のユーザーが共通のグループに所属している必要があります(ここでは
multiplexer
というグループにします)。次に、ソケットの所有グループをそのグループに変更する必要があります(chgrp multiplexer /tmp/our_socket
を実行します)。