バックグランドでジョブを走らせる方法としては, ターミナルプレクサと呼ばれるツールを使う方法もあります.
ターミナルプレクサは 1 つの端末(ウィンドウ)を複数のプロセスで共有するツールです. ターミナルプレクサを用いると複数のジョブを並行して走らせる場合に, 新たなウィンドウを立ち上げる必要がなくなります. 代表的なターミナルプレクサとして screen, tmux があります. 以下では screen について説明します.
使い方の説明の前に screen に関する用語と動作イメージについて触れておきます.
用語 | 意味 |
---|---|
セッション | screen の作る仮想端末. |
ウィンドウ | セッション内での仮想的なウィンドウ. 1 セッション内で複数作り, 切り替えることができる |
デタッチ | セッションから切断すること. |
アタッチ | デタッチしたセッションに再接続すること. |
それぞれの用語の意味するところをイメージするのはちょっと難しいかもしれません. ちょっと雑なたとえですが, X の動作にたとえると, セッションとは X の起動 (startx とコマンドを打つこと), ウィンドウは X 上で立ち上げた個々のターミナル, デタッチはターミナルからマウスカーソルを外すこと, アタッチはマウスカーソルを外したターミナルに再度マウスカーソルをあてること, に対応します(実際はちょっと異なります).
まず screen コマンドがシステムにインストールされているかを確認してください. -v オプションを付けて起動すると以下のような出力が得られるはずです.
$ screen -v Screen version 4.06.02 (GNU) 23-Oct-17
もし "command not found" と表示された場合には, コマンドサーチパスをチェックするか,
以下のコマンドを用いてインストールを行ってください.
※ 今年度はインストール作業の必要はありません.
screen コマンドは情報実験機にインストールされています.
# apt update # apt install screen
これで screen を使う準備ができました. 早速使ってみましょう.
$ screen GNU Screen version 4.06.02 (GNU) 23-Oct-17 Copyright (c) 2015-2017 Juergen Weigert, Alexander Naumov, Amadeusz Slawinski Copyright (c) 2010-2014 Juergen Weigert, Sadrul Habib Chowdhury Copyright (c) 2008-2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury Copyright (c) 1993-2007 Juergen Weigert, Michael Schroeder Copyright (c) 1987 Oliver Laumann ........... (省略) ........... Capabilities: +copy +remote-detach +power-detach +multi-attach +multi-user +font +color-256 +utf8 +rxvt +builtin-telnet [Press Space or Return to end.]
リターンキーを押すとセッションがスタートします. セッションが開始されれば, シェル上でサブシェルを立ち同じ 上げたときと同様に作業をおこなうことができます.
ここで別のコンソールで次のコマンドを入力し, セッションの一覧を表示させてみます.
$ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分26秒) (Attached) 1 Socket in /var/run/screen/S-inex.
現在 1 つのセッションが起動していることを示しています. 先頭の数字はセッションのプロセス番号(PID)です.
セッションからデタッチするには以下のコマンドを入力します.
Ctrl-a d (Ctrl を押しながら a, その後d (Ctrlは離して)) または Ctrl-a Ctrl-d (Ctrl を押しながら a, Ctrl を押しながら d)
再びセッション一覧を表示させてください.
$ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分26秒) (Detached) 1 Socket in /var/run/screen/S-inex.
セッションからデタッチしたため, "Attached" と表示されていた箇所が "Detached" になりました.
セッションを複数立ち上げることも可能です. 以下のコマンドを入力してください.
$ screen ... (リターンキーを入力) Ctrl-a d (Ctrl を押しながら a, その後d (Ctrlは離して)) $ screen -ls There are screens on: 21958.pts-0.joho18 (2017年07月06日 13時37分27秒) (Detached) 21915.pts-0.joho18 (2017年07月06日 13時16分26秒) (Detached) 2 Sockets in /var/run/screen/S-inex.
アタッチされていないセッションにアタッチするには以下のコマンドを入力します.
$ screen -r (PID) (PID はプロセス番号)
セッションを終了するには以下のコマンドを用います.
Ctrl-a k (Ctrl を押しながら a, その後 k (Ctrlは離して)) または Ctrl-a Ctrl-k (Ctrl を押しながら a, Ctrl を押しながら k)
上記のコマンドを用いて現在立ち上げた 2 つのセッションを終了してみましょう.
スクリーンの機能を利用することで, バックグラウンドでジョブを走らせることができます. シェルのバックグラウンドジョブは一般にそれを起動したシェルを終了すると同時に終了 してしまうのに対し, screen を用いて起動したジョブは screen を起動したシェルを終了 しても実行され続けます.
これを体感するため, 2 つのターミナルを用意し, 片方のターミナルで screen を起動, もう片方のターミナルからセッションにアタッチしてみます.
(ターミナル1での作業) $ screen ...(リターンキーを入力) $ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分27秒) (Attached) 1 Socket in /var/run/screen/S-inex. $ Ctrl-a d (Ctrl を押しながら a, その後d (Ctrlは離して)) $
(ターミナル2での作業) $ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分27秒) (Detached) 1 Socket in /var/run/screen/S-inex. $ screen -r (セッションが 1 つしかない場合は PID の入力は不要) $ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分27秒) (Attached) 1 Socket in /var/run/screen/S-inex.
これでターミナル 1 で起動したセッションにターミナル 2 からアタッチすることができました. ターミナル 1 を終了(シェルを終了)してもセッションは残りますので, セッション上で起動したジョブは引き続きターミナル 2 上で実行されます.
この要領で長い時間かかるジョブをバックグラウンドで走らせるには, 次のようにします.
(ターミナル1での作業) $ screen ...(リターンキーを入力) $ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分27秒) (Attached) 1 Socket in /var/run/screen/S-inex. $ (長い時間かかるジョブを実行) $ Ctrl-a d (Ctrl を押しながら a, その後d (Ctrlは離して)) $ exit (シェルもしくはターミナルを終了) ...(しばらく経過した後)... (ターミナル2での作業) $ screen -ls There is a screen on: 21915.pts-0.joho18 (2017年07月06日 13時16分27秒) (Detached) 1 Socket in /var/run/screen/S-inex. $ screen -r (セッションが 1 つしかない場合は PID の入力は不要) $ (長い時間かかるジョブの結果を参照)
screen 上でのコマンドには上記で紹介したもの以外にもさまざまなものがあります. 参考のためデフォルトのキー操作のいくつかを紹介しておきます. 詳しくは screen のオンラインマニュアルを参照してください.
キー操作 | 役割 |
---|---|
Ctrl-a ' | 切り替え先のウィンドウ名またはウィンドウ番号を問い合わせる. |
Ctrl-a " | 選択できるウィンドウのリストを表示する. |
Ctrl-a Ctrl-a | 直前に表示していたウィンドウに移動する. |
Ctrl-a c Ctrl-a Ctrl-c |
セッション内で新しいウィンドウを生成する. |
Ctrl-a C | 画面をクリアする. |
Ctrl-a d Ctrl-a Ctrl-d |
デタッチを行う. |
Ctrl-a D | デタッチとログアウトを行う. |
Ctrl-a k Ctrl-a Ctrl-k |
セッションを終了する. |
Ctrl-a n Ctrl-a Ctrl-n |
次のウィンドウに切り替える. |
Ctrl-a p Ctrl-a Ctrl-p |
前のウィンドウに切り替える. |
Ctrl-a z Ctrl-a Ctrl-z |
screen をサスペンドする. |
Ctrl-a Ctrl-\ | 全てのウィンドウを破棄し screen を終了する. |
情報実験機で
$ man screen
と入力する.