コマンドライン

screen コマンド

screenコマンドの概要

1つのターミナルウインドウで複数のスクリーンを開き、スクリーンを切り替えるscreenコマンドを紹介します。

screenコマンドは1つのターミナル上で仮想的に複数の端末を操作できるようにするツールです。
例えば、何か処理がかかるコマンドを発行しつつ、別の作業を進めたいというケースがあると思います。このようなときscreenコマンドを使えば、処理に時間がかかるコマンドを仮想端末で実行し、再び先ほどのターミナルに戻って他の作業を続けるといったことが可能です。

また、screenが作成した仮想端末は、起動元のターミナルソフトウエアを閉じても状態はそのまま保持されます。そのため、中断されたら困る処理などはscreenコマンドで作成した仮想端末上で行うと安全です。

screen コマンドの特徴
  • ターミナル上で、複数の仮想端末を作成して作業できます。
  • 仮想端末が開かれた状態を保ったままログアウトできます。後から再度ターミナルにログインして、再度仮想端末にアクセス可能です。
  • ターミナル画面を上下に分割して、1画面で複数の端末画面にアクセスできます。

アタッチとデタッチ

screenコマンドで知っておきたい用語はアタッチとデタッチです。
ソフトウェア開発では、実行中のプログラム(プロセス)を監視・制御の対象にすることをアタッチすると言います。逆に、アタッチしていたプログラム(プロセス)を監視下から外すことをデタッチと言います。

screenコマンドでは仮想端末のセッションに接続することをアタッチ、使用中の仮想端末を切断することをデタッチと呼びます。デタッチしてもセッションは生き続けています。

screenの使い方の紹介

screenコマンドで新しいscreenのセッションを始めます。

screen

これで新しいscreenの仮想端末がアタッチされた状態になっています。
仮想端末といっても、実際に作業できることは通常と何も変わりません。
この仮想端末で作業・処理をしているとして、次の操作で仮想端末をデタッチします。

[Ctrl]+a d

[Ctrl]+a dは、[Ctrl]と[a]を同時に押して、離したあとに[d]を押すことを表しています。
また、このキー操作は画面には表示されないので注意してください。

デタッチすると呼び出し元の画面に戻ります。
デタッチ状態で動いている仮想端末の一覧を表示してみましょう。

screen -ls

すると下記のように出力されます(下記は2つの仮想端末がある想定です)。

There are screens on:
        16284.pts-1.ip-xxx-xxx-xxx-xxx    (Detached)
        16212.pts-1.ip-xxx-xxx-xxx-xxx    (Detached)
2 Sockets in /var/run/screen/xxx.

最初に表示された 16284 や 16212 がPIDです。
このPIDを使って、デタッチ状態で動いている仮想端末にアタッチします。

screen -r [PID]

よく使うscreenコマンドの紹介

screenコマンドには仮想端末を起動したり一覧を出力するためのオプションが用意されています。
仮想端末内では[Ctrl]+[a]を押してから、[d]、[k]などを組み合わせるキー操作がいくつか用意されています。

よく使うscreenコマンドオプション
screen
起動
screen -ls
起動中の仮想端末を表示
screen -r プロセス名
指定仮想端末へ復帰
screen -D プロセス名
指定仮想端末を強制終了
仮想端末内で使うキー操作
[Ctrl]+[a] [d]
仮想端末からデタッチする
[Ctrl]+[a] [w]
ウィンドウ一覧を表示
[Ctrl]+[a] [k]
仮想端末を終了する
[Ctrl]+[a] [c]
新しい仮想端末を作成する

仮想端末以外では[Ctrl]+[a]が使えないので、通常の端末上で仮想端末用のキー操作を行うと[Ctrl]+[a]の後に入力したキーがそのままコマンドラインに表示されます。例えばデタッチしようとして、[Ctrl]+[a] [d]でコマンドラインに d と表示された場合、それは仮想端末からでている状態です。仮想端末にいるのかどうかわからなくなったときは、仮想端末内のキー操作を行うか、screen -lsで仮想端末のリストを表示して確認してみてください。

screenコマンドと仮想端末でのキー操作

新しいscreenのセッションを始めます。

screen

仮想端末で処理したい作業が終わり、仮想端末をそのまま残したい場合は、現在開いている仮想端末をデタッチします。

[Ctrl]+a d

仮想端末一覧を表示させてみましょう。
screen -lで先ほどデタッチした仮想端末が表示されます。

screen -ls
There are screens on:
        5617.pts-1.ip-xxx-xxx-xxx-xxx    (Detached)
1 Sockets in /var/run/screen/xxx.

一覧で表示されたPID番号 5617 を使って先ほどの仮想端末にアタッチしましょう。

screen -r 5617

現在開いている仮想端末を閉じます。

[Ctrl]+a k

すると次のように閉じて良いか確認されるので、問題なければ[y]を押して終了してください。

Really kill this window [y/n]

仮想端末にセッション名をつける

複数の仮想端末を起動していると、screen -lsで一覧を表示してもどの仮想端末でどの処理をしているのかがわかりにくくなります。
screenは仮想端末の起動時、起動後にセッション名を設定することができるので、複数の仮想端末を起動しておくときはセッション名を設定すると良いでしょう。

仮想端末起動時にセッション名を設定

screen -S セッション名

-Sオプションでセッション名を設定できます。
たとえば次のようにセッション名を設定します。

screen -S compass_watch_htdocs

screen -ls でセッション名が設定されているか確認してみましょう。

screen -ls
There are screens on:
        19448.compass_watch_htdocs      (Detached)
1 Sockets in /var/run/screen/xxx.

仮想端末起動後にセッション名を設定

仮想端末起動後でもセッション名を設定できます。
まずはセッション名を設定したい仮想端末に接続します。

screen

-Sオプションを使っていないので、セッション名が設定されていません。ここから、[Ctrl]+[a]を押して、[:]を押します。
するとコマンド入力待ち状態になるので、そこに sessionname セッション名 を入力します。

:sessionname セッション名前

仮想端末の分割

仮想端末は上下に分割することができます。
まずは仮想端末にアタッチしましょう。

screen

仮想端末内で画面を上下2分割します。

[Ctrl]+a S

画面分割後にフォーカス画面を変更します(下段の仮想端末に移動します)。

[Ctrl]+a [tab]

分割したばかりの下段はまだ仮想端末にアタッチできていません。下記のキー操作で新しい仮想端末を開きます。

[Ctrl]+a c

これで上下2画面の仮想端末を移動しながら操作が可能になりました。
画面分割を終了する際は次のキー操作になります。

[Ctrl]+a Q

関連記事