LoginSignup
3
3

いきさつ

Linuxで使われるscreenコマンドについて学ぶ機会があったので、まとめていきます。

概要

screen (GNU Screen) とは、1つの画面で複数のプロセス、というより端末環境を動作させるソフトウェアです。Man page にはちゃんとした説明が書いてますが、物は試しで動きを見た方がわかりやすいです。

実践

まずは動かす

まずはシンプルに screen と打ってみます。

$ screen

image.png
Screenのコピーライトのようなものが表示されます。

ここから Enter キーを押すとシェルが開きます。見た目はログイン直後の状態と同じです。ですが確かに screen の中にいます。
後に行う手順のために、echo とか date とか適当なコマンドを打っておきましょう。

(on screen shell)
$ echo hello from screen
hello from screen

screen に対するコマンドは Ctrl-a キーを押したあと、対応するキーを押すことで実行できます。試しに Ctrl-a キーを押し、その後 ? キーを押します。

image.png

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 | を入力します。
image.png
先輩、画面が縦に割れました!その通り、screen 上では画面分割を行うことができます。Ctrl-a | を実行することで垂直に分割できます。画面下部のバーには画面の番号とコマンド名が記載されています。 ちなみに、水平に分割するには Ctrl-a S を実行します。

TL;DR 厳密な定義の話 分割された領域はリージョンと呼ばれます。一方で、screen上で動くシェルなどのプログラムのことをウィンドウと呼びます。1つのリージョンの中では表示するウィンドウを切り替えることができます。

今は左画面にカーソルがある状態です。右に映るため、Ctrl-a <Tab> を実行します。
image.png
カーソルが移動しました。下にウィンドウ名が出ていますが、ここには何もありません。
新しいシェルを立ち上げましょう。 Ctrl-a c を実行します。
image.png

右画面でシェルが立ち上がりました。パチパチ。それではエディタで保存したであろう node app.js を実行してサーバを立ち上げましょう。
image.png

サーバが起動しました。折角なので curl で動作確認を…おっと。右画面ではサーバを動かしていて curl を叩けないじゃありませんか。
また別のシェルを立ち上げることにしましょう。先程と同じように Ctrl-a c を実行します。
image.png

3つ目のconsoleが起動しました。今度こそ curl の出番です。
image.png

これで、サーバへのHTTPアクセスまでを screen 上で完結させることができました。
あれ?サーバを動かしてる画面はどこへ行ったのでしょう。直近の画面を開くには Ctrl-a Ctrl-a を実行します。
image.png

よかった、まだ動いていましたね。
screen 上で並行して動かしている画面はウィンドウと呼ばれ、番号が振られています。

Ctrl-a " を実行するとウィンドウの一覧を表示できます。
image.png

Ctrl-a 番号 を実行することで、該当する番号のウィンドウが開かれます。
以下は左側に2番(curlを叩くために開いたウィンドウ)を開いた図です。
image.png

例えばサーバアクセスの度にログを出すように改変すれば、横に並べながら動作確認できるわけですね。

最後にお片付けをしておきましょう。 Ctrl-a \ はすべてを綺麗さっぱり消し去るコマンドです。実行すると、

Really quit and kill all your windows [y/n]

というメッセージが画面下部に出ます。Y を押すと終了します。

画面をスクロールさせるには

シェルで作業していくと文字が上に流れていきますよね。
上の方は何書いてたかしら…あれ!?マウスホイールで上に行けない!
画面分割しているときはこうなります。このようなときは、コピーモードに入ります。
Ctrl-a [ を実行するとコピーモードに入ります。
カーソルが h,j,k,l キーで動くようになり、k キーやPageDownキーを押し続けて古いログまで遡ることができるようになります。
image.png

分かりにくいですが ll /bin を実行した後めっちゃ上まで戻ってきた図です。
コピーモードを抜けるには Esc キーを押します。

tmux と byobu について少し

Wikipediaで調べてると、 GNU Screen は結構古いものみたいです。
同様のソフトウェアが他にもあります。

tmux

後発の端末多重化ソフトウェアです。
コマンドの打ち方などは異なるようですが、概ねScreenの互換品として使えるみたいです。BSD系列で普及している雰囲気。

byobu

Screen や tmux の上に乗っかって、フロントエンドとして動作するソフトウェアです。
使い勝手が向上しているので、新しく導入するならこっちの方がいいかも。
Ubuntu Serverだと標準搭載です。

参考情報

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3