いきさつ
Linuxで使われるscreenコマンドについて学ぶ機会があったので、まとめていきます。
概要
screen (GNU Screen) とは、1つの画面で複数のプロセス、というより端末環境を動作させるソフトウェアです。Man page にはちゃんとした説明が書いてますが、物は試しで動きを見た方がわかりやすいです。
実践
まずは動かす
まずはシンプルに screen と打ってみます。
$ screen
ここから Enter キーを押すとシェルが開きます。見た目はログイン直後の状態と同じです。ですが確かに screen の中にいます。
後に行う手順のために、echo とか date とか適当なコマンドを打っておきましょう。
(on screen shell)
$ echo hello from screen
hello from screen
screen に対するコマンドは Ctrl-a キーを押したあと、対応するキーを押すことで実行できます。試しに Ctrl-a キーを押し、その後 ? キーを押します。
screen のコマンド一覧が出力されます。今実行した Ctrl-a ?
は、この画面を表示する help コマンドというものになります。Enter キーを押すと元の画面に戻ります。
それでは、 screen から出てみましょう。これを detach と呼びます。Ctrl-a キー を押し、その後 D キーを押します。
(parent shell)
$ screen
[detached from 12420.pts-0.ubuntu-xenial]
$
screen コマンドを打ったシェルに戻ってきました。screen 上のシェルはどうなっているかというと、依然として動いています。
screen -ls
を実行すると、screenで何が動いているかを見れます。
(parent shell)
$ screen -ls
There is a screen on:
12420.pts-0.ubuntu-xenial (10/23/2023 07:25:48 PM) (Detached)
1 Socket in /var/run/screen/S-vagrant.
さて、screen の特徴はもう一つあり、このようにして一度開いたセッションを維持できるという点です。
端末からログアウトしても、作業状態を保存したままにしておけるのです。例えば長時間走行するプログラムを nohup
を付けずに実行したままログアウトしても、screenの中で動いたままになってくれます。
上記の例でも再度ログインしてから screen -ls
を実行すれば、同様の出力が得られるはずです。
では、 screen セッション上のシェルに復帰しましょう。 screen -r
を実行します。
(detach の反対で attach と呼びます)
(parent shell)
$ screen -r
(on screen shell)
$ echo hello from screen
hello from screen
$
正しく screen の上で打ったコマンドの結果が出ていますね。最後に、シェルを終わらせましょう。
(on screen shell)
$ exit
(parent shell)
[screen is terminating]
$ screen -ls
No Sockets found in /var/run/screen/S-vagrant.
-ls
で見ても何も残っていないことが確認できます。
簡単な使い方が分かったところで、実用例を見ていきます。
実例: シェルとテキストエディタ
エディタを開いて編集をしつつ、並行してシェルを立ち上げるという環境を実現してみます。
まずは screen でシェルを開きましょう。
(parent shell)
$ screen
テキストエディタでプログラムを書くとしましょう。ここでは vi を使っています。
(on screen shell)
$ vi
今回はNode.jsのサンプルコードを動かすことにします。サンプルコードを適当なファイルに保存しましょう。引き続き編集したいのでエディタは閉じずにおいておきますが、一旦コードを動かしてみたいです。
そこで、screen上でもう一つの画面を開くことにします。
まず、 Ctrl-a |
を入力します。
先輩、画面が縦に割れました!その通り、screen 上では画面分割を行うことができます。Ctrl-a |
を実行することで垂直に分割できます。画面下部のバーには画面の番号とコマンド名が記載されています。 ちなみに、水平に分割するには Ctrl-a S
を実行します。
TL;DR 厳密な定義の話
分割された領域はリージョンと呼ばれます。一方で、screen上で動くシェルなどのプログラムのことをウィンドウと呼びます。1つのリージョンの中では表示するウィンドウを切り替えることができます。今は左画面にカーソルがある状態です。右に映るため、Ctrl-a <Tab>
を実行します。
カーソルが移動しました。下にウィンドウ名が出ていますが、ここには何もありません。
新しいシェルを立ち上げましょう。 Ctrl-a c
を実行します。
右画面でシェルが立ち上がりました。パチパチ。それではエディタで保存したであろう node app.js
を実行してサーバを立ち上げましょう。
サーバが起動しました。折角なので curl
で動作確認を…おっと。右画面ではサーバを動かしていて curl
を叩けないじゃありませんか。
また別のシェルを立ち上げることにしましょう。先程と同じように Ctrl-a c
を実行します。
3つ目のconsoleが起動しました。今度こそ curl
の出番です。
これで、サーバへのHTTPアクセスまでを screen 上で完結させることができました。
あれ?サーバを動かしてる画面はどこへ行ったのでしょう。直近の画面を開くには Ctrl-a Ctrl-a
を実行します。
よかった、まだ動いていましたね。
screen 上で並行して動かしている画面はウィンドウと呼ばれ、番号が振られています。
Ctrl-a "
を実行するとウィンドウの一覧を表示できます。
Ctrl-a 番号
を実行することで、該当する番号のウィンドウが開かれます。
以下は左側に2番(curlを叩くために開いたウィンドウ)を開いた図です。
例えばサーバアクセスの度にログを出すように改変すれば、横に並べながら動作確認できるわけですね。
最後にお片付けをしておきましょう。 Ctrl-a \
はすべてを綺麗さっぱり消し去るコマンドです。実行すると、
Really quit and kill all your windows [y/n]
というメッセージが画面下部に出ます。Y を押すと終了します。
画面をスクロールさせるには
シェルで作業していくと文字が上に流れていきますよね。
上の方は何書いてたかしら…あれ!?マウスホイールで上に行けない!
画面分割しているときはこうなります。このようなときは、コピーモードに入ります。
Ctrl-a [
を実行するとコピーモードに入ります。
カーソルが h,j,k,l キーで動くようになり、k キーやPageDownキーを押し続けて古いログまで遡ることができるようになります。
分かりにくいですが ll /bin
を実行した後めっちゃ上まで戻ってきた図です。
コピーモードを抜けるには Esc キーを押します。
tmux と byobu について少し
Wikipediaで調べてると、 GNU Screen は結構古いものみたいです。
同様のソフトウェアが他にもあります。
tmux
後発の端末多重化ソフトウェアです。
コマンドの打ち方などは異なるようですが、概ねScreenの互換品として使えるみたいです。BSD系列で普及している雰囲気。
byobu
Screen や tmux の上に乗っかって、フロントエンドとして動作するソフトウェアです。
使い勝手が向上しているので、新しく導入するならこっちの方がいいかも。
Ubuntu Serverだと標準搭載です。