LoginSignup
8
7

More than 1 year has passed since last update.

GNU Screenコマンドをつかってみる

Last updated at Posted at 2022-03-13

GNUのscreenコマンドは1つの端末上に、仮想端末を使い端末を多重化できるターミナルマルチプレクサと呼ばれるソフトウェアです。

screenコマンドは仮想端末を提供し、ユーザは仮想端末や提供されるWindowを逐次切り替えて操作する事ができます。

このコマンドを利用すると下記のような機能が実現できます。

  • 作業途中で仮想端末を抜けて、後で再接続して処理を継続したり。
  • 1つの仮想端末で長時間動くようなタスクをバックグラウンドで動かしつつ、別の仮想端末につないで他の処理を継続したり。
  • 仮想端末上で処理を実行しておいて、一旦ユーザログオフしたとしても仮想端末上で処理は継続され、後でユーザログインして仮想端末に接続すれば処理を継続できたり。
  • sshで端末接続した際に、仮想端末上で処理しておけばssh接続が切れてしまっても、再接続すれば処理を継続できたり。
  • 複数のユーザで仮想端末を共有したり。

etcetc......

そんなscreenコマンドの基本的な使い方を紹介します。

本資料で利用している環境

  • Ubuntu 20.04.4 LTS (GNU/Linux 5.10.60.1-microsoft-standard-WSL2 x86_64)
  • Screen version 4.08.00 (GNU) 05-Feb-20

公式サイト

GNU Screen

利用バージョンの確認

まずは利用するscreenコマンドのバージョンを確認します。
バーションの確認は--versionオプションをつけて確認できます。

screen --version

本資料で利用している環境のバージョンは Screen version 4.08.09 (GNU) 05-Feb-20 になります。

image.png

ユーザマニュアルについて

本資料ではscreenコマンドの基本的な使い方を説明していますが。
本コマンドは出来ることが多いコマンドのため、細かい利用方法は公式ユーザマニュアルをチェックして下さい。

Screen User’s Manual

もしくはman screenも詳しく記載されているのでこちらも参照するとといいかもしれません。

スクリーンセッションの開始

screenコマンドではスクリーンセッションというものを作成し、それをアタッチしたりデタッチして切り替えることにより。
バックグラウンドで別の処理を流したり、必要なった画面を表示したり作業ができます。

スクリーンセッションを開始するのに下記のようにscreenコマンドを実行する。

screen

下記のようにスタートアップメッセージが出てきた場合はエンターを押して次の画面。

image.png

screenコマンドを実行すると、スクリーンセッションを生成し、そこにWindowが作成され、そのWindowの上でシェルが実行されています。

WSL環境の場合

今回、WSL上の環境でscreenコマンドを試していますが。

2022年03月現在、この環境でscreenコマンド実行時にCannot make directory '/run/screen': Permission deniedとエラーが出てきました。

image.png

どうやらsudo /etc/init.d/screen-cleanup startを実行したあとにscreenコマンドを実行すればよいようです。(下記参照)

Running “screen” without additional permissions on WSL

操作について

screenコマンドでは接続したスクリーンセッション上で 制御コード Ctrl+A を押した後に 対応するキー を押して各種操作を実行します。
新しいWindowを生成する場合は CTRL+A を押した後に c を押すといった具合。

なお各種キー操作にはスクリーンコマンドも用意されており、キー操作以外でもこちらを利用しても操作することも出来る。

接続しているスクリーンセッションに対してスクリーンコマンドを実行する方法としては。

screen -X コマンド のように実行するか。
CTRL+A :でコマンドラインモードに入りコマンドを実行すればOK。

screen -X で実行

image.png

コマンドラインモードで実行

image.png

キーバインドを確認してみる

Help

  • CTRL+A ?
  • help

スクリーンセッションに接続した状態で、CTRL+A ?のキー操作でキーバインドを確認できるので確認してみます。

key bindings

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り help で実行。
もしくはscreen -X helpを実行。

スクリーンセッションの一覧を確認してみる

Invoking Screen

  • screen -ls

screen -lsでスクリーンセッション一覧が確認できるので確認してみます。

image.png

現在、44.pts-0.sandboxというスクリーンセッションがアタッチされている事が確認できます。

現在割り当てられているスクリーンセッションを確認する

Session Name

  • Command:sessionname

スクリーンセッションに接続した状態で、sessionnameコマンドを実行すると現在割当られているスクリーンセッション名を確認できます。

スクリーンコマンドで実行する場合

CTRL+A :でコマンドラインモードに入り sessionname で実行。
もしくはscreen -X sessionname で実行。

このコマンドは引数を与えるとセッション名の変更を行えます。
※ただしセッション名を変更しても環境変数$STYに反映されなかったり色々とあるようなので注意が必要です。

スクリーンをデタッチ・アタッチしてみる

Detach

  • CTRL+ d
  • CTRL+A CTRL+D
  • Command:detach

現在アタッチされているスクリーンセッションから抜ける場合はCTRL+A d もしくはCTRL+A CTRL+Dで抜けられます。
コマンドの場合はdetach

デタッチした後に、screen -lsを実行した画面が下記。

image.png

screen -lsで先程までアタッチされていた42がデタッチされている事を確認できます。
スクリーンセッションから抜けているので、当たり前ですがCTRL+A ?等のscreenコマンドのキーバインドは使えない状態です。

デタッチして抜けたセッションに接続するには-r [pid.sessionname]でアタッチできます。

上記の場合はscreen -r 44.pts-0.sandboxと実行すればOK。
ただし完全に指定しなくても一意にマッチすればいいようで、screen -r 42でも接続できます。

さらに言えばセッションが単一だけの場合では、screen -rだけで実行してもセッションに接続できます。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り detach で実行。
もしくはscreen -X detachを実行。

スクリーンセッションに名前をつけて開始する

Invoking Screen

  • screen -S

screen -Sでスクリーンセッションに名前をつけて開始できます。
下記コマンドでfoobarという名前をつけて開始してみます。

screen -S foobar

image.png
image.png

screen -lsでfoobarと名前のつけられた81.foobarというセッションが開始されアタッチされている事が確認できます。

スクリーンセッションを生成時にセッションをアタッチせずに開始する(デタッチモード)

Invoking Screen

  • screen -d -m
  • screen -d -m -S [sessionname]

screen -d -mでスクリーンセッションを生成しますがアタッチせずにスクリーンセッションを生成します。
また-Sオプションを利用してscreen -d -m -S foobarで名前付きデタッチモードのスクリーンセッションを生成できます。

スクリーンセッション名を一意になるように名付ければ。

screen -r foobar というようにスクリーンセッション名だけで接続できるので管理が便利になります。

余談:すでにアタッチされているセッションに接続する場合

色々と操作していてアタッチしたままの状態になって残ってしまったセッションがある場合。
screen -rで接続しようとしても、下記のように再接続できるscreenがないとメッセージが出ます。

image.png

このようなケースではscreen -d -r [pid.sessionname]のように実行すると適宜、デタッチしてアタッチしてくれます。

スクリーンセッションを閉じる

Quit

  • CTRL+A \
  • Command:quit

スクリーンセッションに接続している状態でCTRL+A \を実行するとセッションを閉じる事ができます。

キー操作を行うと確認プロンプトがでるのでy。

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り quit で実行。
もしくはscreen -X quitを実行。

Windowを生成してみる

Screen Command

  • CTRL+A c
  • CTRL+A CTRL+c
  • Command:screen

ここまではスクリーンセッションを複数作って画面管理を行ってきましたが。
スクリーンセッションの中に複数のWindowを作る事が可能です。

新しいWindowを生成する場合は、スクリーンセッションに接続した状態で

CTRL+A c もしくは CTRL+a CTRC+cで新しいWindowを生成します。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り screen で実行。
もしくはscreen -X screenを実行。

生成されたWindowの一覧を確認する

Selecting a Window

  • CTRL+A "
  • Command:windowlist -b

CTRL+A "で生成されているWindowの一覧を確認できます。
またここでWindowの移動も出来ます。

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り windowlist -b で実行。
もしくはscreen -X windowlist -bを実行。

次のWindowへ移動

Selecting a Window

  • CTRL+A space
  • CTRL+A n
  • CTRL+A CTRL+n
  • Command:next

Window listを表示してそこでWindow間の移動ができましたが、上記のコマンドでも移動できます。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り next で実行。
もしくはscreen -X nextを実行。

前のWindowへ移動

Selecting a Window

逆順に移動する場合は下記

  • CTRL+A p
  • CTRL+A CTRL+p
  • CTRL+A CTRL+h
  • CTRL+A BackSpace
  • Command:prev

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り prev で実行。
もしくはscreen -X prevを実行。

Windowにタイトルをつける

Naming Windows (Titles)

  • CTRL+A A
  • Command:title

Windowが多くなってくると、どこで何をやっている画面なのか判別しづらくなってきます。
そんな場合はWindowにタイトルをつける事ができるので、名前をつけることにより識別しやすくなります。

タイトルはCTRL+A Aで設定する。

image.png

コマンドを入力するとset window's title to:と出てくるので、ここで現在のタイトルから変更する事ができます。

Windows Listでも下記のように変更されている事が確認できます。これでわかりやすい。

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り title [window title] で実行。
もしくはscreen -X title [window title]を実行。

現在開いているWindowを確認する

Number

  • CTRL+A N
  • Command:number

現在、どのWindowを開いてるかは、CTRL+A Nで確認できます。

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り number で実行。
もしくはscreen -X numberを実行。

現在開いているWindowを閉じる

kill

  • CTRL+A k
  • CTRL+A K
  • Command:kill

スクリーンセッションに接続している状態でキー操作CTRL+A K もしくは CTRL+A k でWindowを閉じる。

image.png

確認メッセージが出てくるので、yを入力して閉じる事ができます。
複数のWindowと開いている場合はWindowが閉じられて、他のWindowに移動します。
開いているWindowが1つの場合は、スクリーンセッションが閉じらます。

なおexitCTRL+Dを送信しても同様に現在のWindowを閉じることができます。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り kill で実行。
もしくはscreen -X killを実行。

画面を分割する

Split

横分割

  • CTRL+A S
  • Command:split

縦分割

  • CTRL+A |
  • Command:split -v

先にWindowの話をしてしまいましたが、スクリーンセッションにはRegionと呼ばれる領域があり。
Regionを分割して、分割したRegionにWindowを割り当てることにより画面を分割します。

Region

スクリーンセッションに接続している状態でキー操作CTRL+A Sを実行して画面を横に分割できます。
※縦に分割する場合はCTRL+A |

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り split で実行。
もしくはscreen -X splitを実行。
※縦分割の場合はsplit v

分割された画面の移動

Focus

  • CTRL+A TAB
  • Command:focus

スクリーンセッションに接続している状態でCTRL+A TABを実行してフォーカスを分割された次のリージョンに移動できます。

image.png

分かりづらいですが、上の画像では分割された画面の下側にフォーカスが移動しています。(キャレットが下半分の画面に移動している)
また初期状態では下半分にはWindowが割り当てられていない状態となっています。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り focus で実行。
もしくはscreen -X focusを実行。

Region上にWindowを表示

Screen

  • CTRL+A c
  • CTRL+A CTRL+c
  • Command:screen

CTRL+A c もしくは CTRL+A CTRC+cで新しいWindowを生成するとRegionにWindowがアタッチされます。

image.png

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り screen で実行。
もしくはscreen -X screenを実行。

またCTRL+A "でWindow listから選択してWindowを選択する事や。
CTRL+A nでWindowを表示する事もできます。

現在のRegionを閉じる

Remove

  • CTRL+A X
  • Command:remove

スクリーンセッションに接続している状態でCTRL+A Xを実行することで現在のRegionを閉じる事が出来ます。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り remove で実行。
もしくはscreen -X removeを実行。

現在のRegion以外をすべて閉じる

Only

  • CTRL+A Q
  • Command:Only

スクリーンセッションに接続している状態でCTRL+A Qを実行することで現在のRegionを閉じる事が出来ます。

スクリーンコマンドで実行する場合は

CTRL+A :でコマンドラインモードに入り only で実行。
もしくはscreen -X onlyを実行。

Regionのリサイズ

Resize

  • screen -X resize 40%
  • Command:resize

Regionのリサイズはコマンドから実行します。

screen -X resize 40%と実行すれば現在のRegionが全体の40%の大きさになります。

CTRL+A :からresize 40%と実行もできます。

サイズ指定方法は色々とあるのでマニュアルを参照して下さい。

image.png

Window Captionについて

Caption

  • Command: caption always|splitonly [string]
  • Command: caption string [string]

Regionを分割した際に、Window下部にキャプションが表示されます。

image.png

captionのデフォルトではsplitonlyが設定されており画面分割時のみしかキャプションが表示されませんが。
alwaysを指定することにより単一ウィンドウの場合でもcaptionを表示する事ができます。

CTRL+A :でコマンドラインモードに入り caption always で実行。
もしくはscreen -X caption alwaysを実行。

image.png

image.png

また[string]の部分に書式を設定する事により表示をカスタマイズする事ができます。

書式については下記に記載があります。

String Escapes

.screenrcについて

Customizing

.screenrcを記述することによりデフォルトのscreen設定を変更する事ができます。
.screenrcのデフォルト配置場所としてはuser’s home directory と /usr/local/etc/screenrc.

一例としてはscreenの実行時にスタートアップメッセージが表示されますが、これはstartup_messageで制御されています。

Startup Message

.screenrcファイルにstartup_message offと記載すれば、スクリーンセッション起動時にstartup_message offの状態で起動されてスタートアップメッセージが表示されません。

image.png

また別の例としては、captionを.screenrcに記述することによりカスタマイズしたWindow captionを表示して画面をわかりやすいしたりできます。

captionの書式がなかなか難しいですが、下記ブログのようにsetenvを使って書くこともできるようです。

GNU screenのcaptionとhardstatusの整理

総評

今回は基本的と思われる使い方を説明してみました。

公式のマニュアルをみるとわかりますが、screenコマンドは多岐に渡った機能が提供されている事がわかります。
今回はまったくふれませんでしたが、

  • マルチユーザでセッションを共有できる機能。
  • コピー&ペーストの機能。

等々使いこなせば便利であろう機能が色々とあります。

多種多様な機能があるだけに、さわりはじめはかなりとっつきづらい印象がありますが。
公式マニュアルがしっかり書いてあるので、これを読めばなんとかなるという感じ。

8
7
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
8
7