バックグランドでコマンドを走らせる方法としては, ターミナルプレクサと呼ばれるツールを使う方法もあります.
ターミナルプレクサは 1 つの端末(ウィンドウ)を複数のプロセスで共有するツールです. ターミナルプレクサを用いると複数のコマンドを並行して走らせる場合に, 新たなウィンドウを立ち上げる必要がなくなります. 代表的なターミナルプレクサとして screen, tmux があります.
最初に screen に関する用語と動作イメージについて触れておきます.
用語 | 意味 |
---|---|
セッション | screen の作る仮想端末. |
ウィンドウ | セッション内での仮想的なウィンドウ. 1 セッション内で複数作り, 切り替えることができる |
デタッチ | セッションから切断すること. |
アタッチ | デタッチしたセッションに再接続すること. |
それぞれの用語の意味するところをイメージするのはちょっと難しいかもしれません. ちょっと雑なたとえですが, X の動作にたとえると, セッションとは X の起動 (startx とコマンドを打つこと), ウィンドウは X 上で立ち上げた個々のターミナル, デタッチはターミナルからマウスカーソルを外すこと, アタッチはマウスカーソルを外したターミナルに再度マウスカーソルをあてること, に対応します(実際はちょっと異なります).
まず screen コマンドがシステムにインストールされているかを確認してください. -v オプションを付けて起動すると以下のような出力が得られるはずです.
$ screen -v Screen version 4.05.00 (GNU) 10-Dec-16
もし "command not found" と表示された場合には, コマンドサーチパスをチェックするか, 以下のコマンドを用いてインストールを行ってください.
# apt update # apt install screen
これで screen を使う準備ができました. 早速使ってみましょう.
$ screen Screen version 4.05.00 (GNU) 10-Dec-16 Copyright (c) 2010 Juergen Weigert, Sadrul Habib Chowdhury Copyright (c) 2008, 2009 Juergen Weigert, Michael Schroeder, Micah Cowan, Sadrul Habib Chowdhury Copyright (c) 1993-2002, 2003, 2005, 2006, 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 を終了する. |
この節では tmux (Terminal Multiplexer) について説明します. 基本的な考え方と機能は前節の screen と同様です. tmux を使うには以下の ようにします.
$ tmuxこれで新規のセッションが立ち上がります. 作業を一時中断するには デタッチし, 作業を再開するときにアタッチします. 1 つのセッションの中で複数のウィンドウを作成し切替えながら 作業することができます. screen と同様に長い時間がかかるコマンドの実行も可能です.
tmux を起動する際のいくつかの例を紹介しておきます. 詳しくは tmux のオンラインマニュアルを参照してください.
コマンド | 説明 |
---|---|
tmux | 新しくセッションを起動. |
tmux a | 中断していたセッションに戻る (アタッチ). |
tmux ls | セッションの一覧を表示. |
tmux kill-session -t 名前 | 指定したセッションを終了. |
tmux を起動した後に使うことのできるキー操作のいくつかを紹介しておきます. 詳しくは tmux のオンラインマニュアルを参照してください.
キー操作 | 説明 |
---|---|
Ctrl-b d | セッションを一時的に中断 (デタッチ). |
Ctrl-b c | 新規のウィンドウの作成. |
Ctrl-b 数字 | 数字で指定したウィンドウに移動. |
Ctrl-b n | 次のウィンドウに移動. |
Ctrl-b p | 前のウィンドウに移動. |
Ctrl-b w | ウィンドウの一覧を表示. |
Ctrl-b , | ウィンドウ名を変更. |
Ctrl-b " | 上下分割. |
Ctrl-b % | 左右分割. |
Ctrl-b [ | カーソルモード (ウィンドウ中でのカーソル移動, 文字列のコピー・ペーストができる)の開始 (ENTER で戻る). |
Ctrl-b ? | キーバインドの一覧表示 (q で戻る) |