元セブ島在住のエンジニアの僕「Tommy」が、プログラミング・英語・セブ事情を発信するブログ

Tommy's blog

【Linux】SSH接続が切れても作業を継続する方法【結論:screenコマンドを使う】

9月 30, 2019

プログラム学生
ターミナルで作業をしてた時、突然、SSH接続が切れてしまって作業が台無しになったのですが、途中で接続が切れても作業を継続する方法ってありますか?
作業前に、「screen」というコマンドを使えば解決すると思うから、それを説明するね。
Tommy

この記事で分かること

  • リモート切断しても処理を継続させる方法が分かる
  • 「screen」の使い方が分かる

【Linux】SSH接続が切れても作業を継続する方法の概要

この記事では、SSH接続でのターミナル作業中にネットワークが切れた場合でも、実施していた作業を継続する方法を説明します。

昨今、レンタルサーバーの多くは、Linuxサーバーですが、もしこれを読んでくれているあなたが、ブログ運営などでレンタルサーバーを借りている場合、Linuxの仕組み仕組みを知ると、エンジニアとしての一歩を踏み出せるかもしれません。

Linuxの仕組みを知る上で、下記Linux初心者向けの記事が参考になります。こちらも合わせて読んでください。

ところで、皆さんは、ターミナル作業の作業でセッションが切れて焦った経験はありませんか?

以前は私も「リモートで作業」そのような環境に悩まされていました。特にセブ島はインターネット環境が、比較的悪いと言われていて、時々インターネット回線が切断されることがあります。

この「リモート作業」でどのようなことを実施するか?については、下記の記事で紹介していますので、こちらの記事も合わせて読んでください。

このように、ネットワークが不安定で、途中で止まってしまうような環境では、作業がとまってしまい、長時間かかるコマンド処理の結果が得られず、なかなか作業が進まない為、ターミナルを使ったリモート作業中のエンジニアにとっては、死活問題になります。

こんな時にこの「screen」コマンドを使うと、サーバとクライアントPCのターミナルによるセッションが切れても、後からそのセッションにアタッチすることができます。これによって以前は諦めていたセッション断による作業を継続することができるようになります。

【Linux】SSH接続が切れても作業を継続する方法の詳細

LinuxのSSH接続がネットワークの不調などの原因により切れてしまっても、作業を継続する方法として、screenコマンドを使ってscreenセッションを作り、screenセッションの上でターミナル作業をすることが1つの方法です。下記はscreenセッションを扱うscreenコマンドの基本的な操作方法を説明します。

  • screenセッションを起動する
  • 現在のscreenセッション一覧を確認する
  • screenセッションにアタッチする
  • screenセッションをデタッチする
  • screenセッションに名前を付ける

続けて、下記では複数人数でターミナル作業する場合に、複数人数でのscreeenセッションの共有方法を説明します。

  • screenで他のユーザーにセッションを共有する

screenセッションを起動する

screenセッションの起動を行います。screenセッションを起動することで、現在のターミナルを使ったサーバー接続とは異なったセッションを作ることができ、万が一接続が切れてしまったとしても、セッションに再びさい接続することで、接続が切れた時点から作業を再開することができます。

$ screen

「screen」コマンドを実行する。

現在のscreenセッション一覧を確認する

screenコマンドのオプション「ls」を使って、現在のscreenセッションを一覧を確認します。screenセッションの一覧を確認することによって、現在存在するセッションや使用中のセッションを確認することができます。

下の例では、ID:10000番の「XXXXX」という名前のセッションがデタッチ状態であります という意味になります。

※この「XXXXX」は実際には具体的な数字になりますので、各自の環境で確認ください。

$ screen -ls
There is a screen on:
        10000.pts-1.XXXXX   (Detached)
        1 Socket in /var/run/screen/S-XXXX.

「screen」コマンドを「ls」オプションで実行する。

screenセッションにアタッチする

複数のセッションがある場合は、「screen -ls」で調べたIDを指定してセッションに接続することができます。この「screeenセッションに接続する」ことを「アタッチする」と言います。

$ screen -r

「screen」コマンドを「r」オプションで実行する。

screenセッションをデタッチする

上記で説明した「screeenセッションのアタッチ」とは反対に、「screenセッションの接続を意図的に切る」ことを「screenセッションのデタッチ」と呼びます。ここでは、screenコマンドのオプション「d」を使って、現在のscreenセッションをデタッチをします。

$ screen -d

「screen」コマンドを「d」オプションで実行する。

screenセッションに名前を付ける

screenセッションには自分がどのような目的や意図で起動したセッションなのかを明らかにする為に、セッションに名前を付けることができます。ここでは、screenコマンドのオプション「S」を使って、名前付きのセッションを起動する方法を説明します。

※ここではscreenセッションに、「hogehoge」という名前をつけた例を書きます。

$screen -S hogehoge

「screen」コマンドを「S」オプションの引数に「hogehoge」を指定して実行する。

screenで他のユーザーにセッションを共有する

screenには、複数人数のユーザーから1つのセッションにアタッチして、ターミナル作業を共有することができます。screenで他のユーザーにセッションを共有する為には下記の手順が必要になります。

  1. 「screen」コマンドの「SUID」を設定する
  2. 「screen」コマンドのアクセス権を設定する
  3. 「screen」セッションを開始する
  4. 「screen」セッションを探す
  5. 「screen」セッションにアタッチする

1.「screen」コマンドの「SUID」を設定する

screenコマンド「/usr/bin/screen」のSUIDを「setuid root」に設定する。

$chmod u+s /usr/bin/screen

「chmod」コマンドを「u+s」オプションの引数に「/usr/bin/screen」を指定して実行する。

2.「screen」コマンドのアクセス権を設定する

screenの実行ファイル「/var/run/screen」のパーミッション(アクセス権)を「755」に設定する。

$chmod 755 /var/run/screen

「chmod」コマンドを「755」オプションの引数に「/var/run/screen」を指定して実行する。

3.「screen」セッションを開始する

セッション名を指定してscreenセッションを開始する。

※今回は、「hogehoge」という名前のセッションを開始します。

$screen -S hogehoge

「screen」コマンドを「S」オプションの引数に「hogehoge」を指定して実行する。

4.「screen」セッションを探す

「screen」コマンド実行中では以下の手順」で他の人にscreenセッションの共有を追加することができます。

Ctrl+a で「:multiuser on」を入力して、マルチユーザーモードをonにする。

Ctrl+a で「:acladd userB」を入力して、ユーザー”userB”をこのセッションの共有に追加する。

また、screenセッションを共有された人は次の手順で自分がセッションの共有が追加されたことを確認することができます。

「screen -ls userA/」と実行して、リストにセッション名が入っていることを確認する。

$screen -ls userA/

「screen」コマンドを「ls」オプションの引数に「userA」を指定して実行する。

5.「screen」セッションにアタッチする

「-xオプション」で「hogehoge」という名前のscreenセッションにアタッチする

$screen -x userA/hogehoge

「screen」コマンドを「x」オプションの引数に「userA/hogehoge」を指定して実行する。