Linux の screen コマンドの使い方

  • Linux の screen コマンドは、ターミナル アプリケーションをバックグラウンドで実行し、必要に応じて切り替えることができる汎用性の高いツールです。
  • 分割画面表示をサポートしており、切断と再接続後でも SSH 接続を介して使用できます。
  • screen を使用すると、新しいウィンドウを作成、複数のプロセスを実行、セッションを切り離して再接続、複数のユーザー間でセッションをリアルタイムで共有できます。

Linux のscreenコマンドを使用すると、実行中のターミナル アプリケーションをバックグラウンドにプッシュして、表示したいときに前面に引き出すことができます。また、分割画面表示をサポートしており、切断と再接続後でも SSH 接続を介して動作します。

screen コマンドとは

screenコマンドはターミナル マルチプレクサーであり、オプションが満載です。多くのことができるというのは控えめな表現です。マニュアル ページは 4,100 行を超えています。

以下は、screenコマンドを使用する最も一般的なケースであり、この記事で詳しく説明します。

  • 標準的な操作は、シェルを含む新しいウィンドウを作成し、コマンドを実行し、ウィンドウをバックグラウンドにプッシュします(「切り離し」と呼ばれます)。プロセスの進行状況を確認したい場合は、ウィンドウを再び前面に引き出して(「再接続」)、再度使用できます。これは、ターミナル ウィンドウを閉じて誤って終了させたくないような、長時間のプロセスに最適です。
  • screenセッションが実行されたら、新しいウィンドウを作成して、その中で他のプロセスを実行できます。ウィンドウ間を簡単に切り替えて、進行状況を監視できます。ターミナル ウィンドウを垂直または水平領域に分割し、さまざまなscreenウィンドウを 1 つのウィンドウに表示することもできます。
  • リモート マシンに接続し、screenセッションを開始して、プロセスを起動できます。リモート ホストから切断して再接続しても、プロセスは実行され続けます。
  • 2 つの異なる SSH 接続間でscreenセッションを共有して、2 人が同じものをリアルタイムで確認できるようにすることができます。

Linux screen のインストール

Ubuntu にscreenをインストールするには、このコマンドを使用します。

sudo apt-get install screen

Manjaro にscreenをインストールするには、次のコマンドを使用します。

sudo pacman -Sy screen

Fedora では、次のように入力します。

sudo dnf install screen

Linux screen の基本

screenを開始するには、以下のように入力して Enter キーを押します。

screen

ライセンス情報ページが表示されます。Space キーを押して 2 ページ目を読んだり、Enter キーを押してコマンド プロンプトに戻ることができます。

コマンド プロンプトが表示され、特に何も起こらなかったように見えます。しかし、現在は、多重化されたターミナル エミュレーター内でシェルを実行しています。なぜこれが良いことなのでしょうか?完了までに時間がかかるプロセスを開始してみましょう。最新の Linux カーネルのソース コードをダウンロードして、latest_kernel.zipというファイルにリダイレクトします。

これを行うには、次のように入力します。

curl https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.9.tar.xz > latest_kernel.zip

ダウンロードが開始され、curlの出力に進行状況が表示されます。

次の操作はキーストローク シーケンスなので、画像でお見せすることはできません。Ctrl+A を入力し、キーを放して、d を押して画面を切り離します。

ダウンロード プロセスは実行され続けますが、ダウンロードを表示するウィンドウは削除されます。screenセッションを起動したターミナル ウィンドウに戻ります。メッセージには、23167.pts-0.howtogeekというラベルのscreenウィンドウが切り離されたことが示されます。

ウィンドウ名を再接続するには、ウィンドウ名の先頭にある番号が必要です。忘れた場合は、常に-ls(リスト)オプションを使用して、切り離されたウィンドウのリストを取得できます。

screen -ls

準備ができたら、-r(再接続)オプションとセッションの番号を使用して、次のように再接続できます。

screen -r 23167

バックグラウンドで動作していたウィンドウが、まるで最初からそこにあったかのように、ターミナル ウィンドウに戻ってきました。

最後まで実行されるプロセスであれば、最終的には完了します。継続的なプロセスであれば、最終的には終了する必要があります。いずれの場合でも、プロセスが終了したら、exitを入力してscreenを終了できます。または、Ctrl+A を押してから K を押して、ウィンドウを強制終了できます。

次のコマンドを入力します。

exit

前のターミナル ウィンドウに戻りますが、ウィンドウを再接続するために使用したコマンドがまだ表示されます。切り離されたウィンドウが 1 つしかないため、screenが終了するというメッセージが表示されます。

Linux screen セッションから切り離す、その他のショートカット

screen セッションから切り離す方法については簡単に触れましたが、繰り返す価値があります。慣れるべき他の一般的なショートカットもいくつか紹介します。

screen を使用しているとき、ショートカットは通常、Ctrl + a に続けて文字を入力する形式になります。Ctrl + a を押すと、screen に「別の入力を探す必要があります」と通知されます。

主なキー

2 番目のキー

アクション

Ctrl + a

d

現在の screen から切断

Ctrl + a

"

利用可能な screen ウィンドウをすべて表示

Ctrl + a

1,2,3...9

特定の番号の screen に接続

Ctrl + a

i

現在の screen に関する情報を表示

Ctrl + a

k

現在のウィンドウを終了

Ctrl + a

\

すべてのウィンドウを終了し、screen を終了

これはすべてを網羅したリストではありませんが、必要なほとんどの操作を行うのに役立ちます。記事の後半では、特定のシナリオに便利なキーバインドについて詳しく説明します。キーバインドのリスト全体を確認したい場合は、GNU screen の公式 Web サイトに詳しいドキュメントがあります。

Linux で名前付き screen セッションを使用する

-S(セッション名)オプションを使用して、screenセッションに名前を付けることができます。セッションの数値 ID ではなく、覚えやすい名前を使用すると、セッションに再接続しやすくなります。セッションに「bigfile」という名前を付けるには、次のように入力します。

screen -S bigfile

screenがセッションを起動すると、コマンド プロンプトを含む空白のウィンドウが表示されます。大きなファイルをダウンロードするので、長時間のプロセスを例として使用できます。

次のように入力します。

curl http://ipv4.download.thinkbroadband.com/1GB.zip > bigfile.zip

ダウンロードが開始したら、Ctrl+A を押してから D を押してセッションを切断します。-ls(リスト)オプションをscreenで使用する場合は、次のように入力して、切り離されたセッションの詳細を確認します。

screen -ls

数値 ID(23266)の後ろにセッションの名前(bigfile)が表示されます。セッションの名前を含めて、次のように入力して再接続します。

screen -r bigfile

ダウンロード ウィンドウに再接続され、長いダウンロードがまだ進行中であることがわかります。

ダウンロードが完了したら、exitを入力してセッション ウィンドウを閉じます。

複数のウィンドウで screen を使用する

これまで、screenを使用して、切り離されたウィンドウで単一のプロセスをバックグラウンドに配置してきました。しかし、screenはそれ以上のことができます。次に、コンピューターのいくつかの側面を監視できるいくつかのプロセスを実行します。

「monitor」という名前の screen セッションを開始するには、次のように入力します。

screen -S monitor

新しいウィンドウ セッションのコマンド プロンプトで、dmesgを起動し、-H(人間が読める)および-w(新しいメッセージを待つ)オプションを使用します。これにより、カーネル バッファー メッセージが表示されます。新しいメッセージは、発生すると表示されます。

次のように入力します。

dmesg -H -w

既存のメッセージが表示されます。dmsegは新しいメッセージを待機しており、到着すると表示するので、コマンド プロンプトに戻りません。

別のアプリケーションを実行したいので、新しいscreenウィンドウが必要です。Ctrl+A を押してから C を押して、新しいウィンドウを作成します。watchを使用してvmstatを繰り返し実行し、コンピューターの仮想メモリの使用状況を頻繁に更新して表示します。

新しいコマンド プロンプトで、次のように入力します。

watch vmstat

vmstatの出力は 2 秒ごとに表示され、更新されます。

2 つのプロセスが実行されています。screenウィンドウ間を移動するには、Ctrl+A を押してからウィンドウの番号を押します。最初に作成したウィンドウはウィンドウ 0(0)、次はウィンドウ 1 などです。最初のウィンドウ(dmesgウィンドウ)に移動するには、Ctrl+A と 0 を押します。

Ctrl+A と 1 を押すと、vmstatウィンドウに戻ります。

かなり便利です。Ctrl+A を押してから D を押して、このセッションから切断できます。後で再接続できます。両方のセッションは実行され続けます。繰り返しますが、ウィンドウ間を切り替えるには、Ctrl+A を押してから、切り替え先のウィンドウの番号(0 または 1)を押します。

次のステップに進み、1 つのウィンドウで両方の画面を表示します。これを行う場合は、ターミナル ウィンドウをこのステップが役立つサイズに伸ばします。私たちの例はスクリーンショットのサイズに制限されているため、ウィンドウは少し狭く見えます。

これを行うには、Ctrl+A を押してから Shift+S を押します(大文字の「S」が必要です)。

ウィンドウが 2 つの「領域」に分割されます。

上部の領域には引き続きvmstatが表示され、下部の領域は空白です。カーソルは下のスクリーンショットで強調表示されています。下部の領域に移動するには、Ctrl+A を押してから Tab を押します。

カーソルは下部の領域に移動しますが、それは本当に空の領域です。これはシェルではないため、何も入力できません。便利な表示を取得するには、Ctrl+A を押してから「0」を押して、この領域にdmesgウィンドウを表示します。

これにより、分割されたウィンドウで両方のライブ出力が得られます。Ctrl+A と D を押してウィンドウを切断してから再接続すると、分割ペイン ビューが失われます。ただし、次のキーボード ショートカットを使用して復元できます。

  • Ctrl+A、S:ウィンドウを水平に分割します。
  • Ctrl+ATab:下部の領域に移動します。
  • Ctrl+A、0:下部の領域にウィンドウ 0 を表示します。

さらに一歩進めることができます。下部ペインを垂直に分割し、ディスプレイに 3 番目のプロセスを追加します。カーソルが下部の領域にある状態で、Ctrl+A と C を押して、シェルを含む新しいウィンドウを作成します。下部の領域に新しいウィンドウが表示され、コマンド プロンプトが表示されます。

次に、dfコマンドを実行してファイル システムの使用状況を確認します。

df

dfが実行されているのを確認したら、Ctrl+A とパイプ文字(|)を押します。これにより、下部の領域が垂直に分割されます。Ctrl+A と Tab を押して新しい領域に移動します。次に、Ctrl+A と 0 を押してdmesgウィンドウを表示します。

領域間を移動したり、さらに垂直または水平の分割を追加したりすることもできます。以下に、他の便利なキーの組み合わせをいくつか示します。

  • Ctrl+A:現在の領域と前の領域の間を行き来します。
  • Ctrl+A、Q:現在の領域以外のすべての領域を閉じます。
  • Ctrl+A、X:現在の領域を閉じます。

SSH 経由で screen を使用する

screenを使用すると、ウィンドウ セッションを開始し、バックグラウンドで実行されたまま切断し、ログオフまたはログインし直して、セッションを再接続できます。

sshコマンドを使用して、別のコンピューターからコンピューターに SSH 接続してみましょう。接続するアカウントの名前とリモート コンピューターのアドレスを指定する必要があります。

今回の例では、次のように入力します。

ssh [email protected]

リモート コンピューターで認証してログインしたら、次のように入力して「ssh-geek」という名前のscreenセッションを開始します。

screen -S ssh-geek

デモンストレーションの目的で、screenウィンドウでtopを実行しますが、長時間実行されるプロセスや無限のプロセスを開始することもできます。

次のように入力します。

top

ウィンドウでtopが実行されたら、Ctrl+A を押してから D を押してウィンドウを切断します。

元のリモート ターミナル ウィンドウに戻ります。

以下に示すようにexitを入力すると、SSH セッションが切断され、ローカル コンピューターに戻ります。

exit

再接続するには、次のように入力します。

ssh [email protected]

再接続してログインしたら、次のように入力してscreenセッションを再接続できます。

screen -r ssh-geek

これで、まだ実行中のtopのインスタンスに再接続されます。

これは、1 つのマシンでプロセスを開始し、別のマシンで中断したところから再開したい場合に最適です。

screen セッションの共有

screenセッションを使用して、2 人が同じウィンドウを見て操作できるようにすることもできます。コンピューターで Fedora を実行している人が Ubuntu サーバーに接続したいとします。

彼は次のように入力します。

ssh [email protected]

接続したら、-S(セッション名)オプションを使用して「ssh-geek」という名前の screen セッションを開始します。また、-d(切断)オプションと-m(強制作成)オプションを使用して、すでに切断されている新しいscreenセッションを作成します。

彼は次のように入力します。

screen -d -m -S ssh-geek

彼は、-x(マルチスクリーン モード)オプションを使用してセッションに接続し、次のように入力します。

screen -x ssh-geek

Manjaro コンピューターでは、別の人が以下に示すように、同じアカウントの資格情報を使用して Ubuntu コンピューターに接続します。

ssh [email protected]

接続したら、screenコマンドを入力し、-X(マルチスクリーン モード)オプションを使用して同じウィンドウ セッションに参加します。

screen -X ssh-geek

これで、どちらかが入力したものは、もう一方にも表示されます。たとえば、1 人が date コマンドを実行すると、両方が入力されたものを表示し、その出力を表示します。

2 人とも、リモート Ubuntu コンピューターで実行されているscreenセッションを共有しています。

1987 年に最初に世に出たソフトウェアの場合、screenは依然として優れた生産性を発揮します。使い慣れておくと、時間を有効に活用できます。