GNU Screen
GNU Screen はテキストプログラムとシェルを分離させることができるラッパーです。Screen を使うことで、例えば、X のターミナルでテキストプログラムを起動して、X を終了し、プログラムを使い続けることなどが可能になります。
目次
- 1 インストール
- 2 使用方法
- 3 ヒントとテクニック
- 3.1 systemd で自動起動
- 3.2 エスケープキーを変更する
- 3.3 ウィンドウ1から起動
- 3.4 入れ子の screen セッション
- 3.5 毎回シェルで Screen を起動する
- 3.6 256色を使う
- 3.7 有益なステータスバー
- 3.8 ウェルカムメッセージをオフにする
- 3.9 hardstatus 行を urxvt|xterm|aterm のウィンドウタイトルに動的に変える
- 3.10 X のスクロール機能を使う
- 3.11 動作中のプログラムを screen にアタッチ
- 3.12 screen で別の bash プロンプトを設定
- 3.13 ビジュアルベルを切る
- 3.14 垂直・水平バーを表示しない
- 4 トラブルシューティング
- 5 参照
インストール
GNU Screen は screen パッケージを使ってインストールできます。
使用方法
コマンドを入力するときはエスケープキーの ctrl+a
を押してからキーバインディングを押します。
ユーザーによってはデフォルトのエスケープキー ctrl+a
は不便かもしれません。下に書かれているようにエスケープキーは別のキーに変更することが可能です。
よく使われるコマンド
ctrl+a
?
コマンドとコマンドのデフォルトを表示 (とても重要です)ctrl+a
:
screen のコマンドプロンプトに入るctrl+a
"
ウィンドウリストctrl+a
0
ウィンドウ0を開くctrl+a
A
現在のウィンドウの名前を変更ctrl+a
a
現在のウィンドウにctrl+a
を送信ctrl+a
c
新しいウィンドウ (とシェル) を作成ctrl+a
S
現在の領域を水平に2つの領域に分割ctrl+a
|
現在の領域を垂直に2つの領域に分割ctrl+a
tab
次の領域に入力フォーカスを移動ctrl+a
ctrl+a
現在の領域と前の領域を切り替えctrl+a
Esc
コピーモードに入ります (enter を使ってテキストの範囲を選択)ctrl+a
]
テキストの貼り付けctrl+a
Q
現在の領域以外の全ての領域を閉じるctrl+a
X
現在の領域を閉じるctrl+a
d
現在の screen セッションからデタッチ、動作し続ける。復帰するにはscreen -r
を使う
コマンドプロンプトコマンド
ctrl+a
:quit
全てのウィンドウと screen セッションを終了ctrl+a
:source ~/.screenrc
screenrc 設定ファイルをリロード (/etc/screenrc を使うことも可能)
セッションに名前を付ける
名前付きセッションを作成するには、次のコマンドで screen を起動します:
$ screen -S session_name
既存のセッションの名前を変更するには、screen が実行しているときに次のコマンドを実行: ctrl+a
:sessionname session_name
。
screen のセッションを識別する pid.tty.host 文字列のリストを出力するには:
$ screen -list
名前付き screen セッションにアタッチするには、次のコマンドを実行:
$ screen -x session_name
または:
$ screen -r session_name
Screen のカスタマイズ
Screen のデフォルト設定を変更したい場合は .screenrc
ファイル (例: ~/.screenrc
) を使用するか (起動時に実行するコマンドを記述)、あるいはコロン (-
) コマンドを使います。
ヒントとテクニック
systemd で自動起動
以下のサービスは特定のユーザーで screen を自動的に起動します (例: systemctl enable screen@florian
)。systemd --user インスタンスは特定のユーザーの最後のセッションが閉じたときに終了されることが保証されていないので、システムユニットとして実行する必要があります。
/etc/systemd/system/screen@.service
[Unit] Description=screen After=network.target [Service] Type=simple User=%i ExecStart=/usr/bin/screen -DmS autoscreen ExecStop=/usr/bin/screen -S autoscreen -X quit [Install] WantedBy=multi-user.target
エスケープキーを変更する
デフォルトのエスケープキーを変更する理由としては、"a" を押すのが左手の小指だから、あるいは、GNU Readline や Bash などのシェルでは ctrl+a
が beginning-of-line
コマンドにマッピングされていることが挙げられます。
エスケープキーは ~/.screenrc
の escape
オプションで変更できます。あるいは screen
を実行するときに -e
オプションを指定します。
例えば、シェルやエディタで ctrl+j
を使用することがないのであれば、escape ^Jj
でエスケープキーを ctrl-j
に設定できます。2番目の "j" は ctrl-j j
でターミナルに ctrl-j
リテラルを送信することを意味します。Dvorak キーボードを使っている場合、ctrl-t
(escape ^Tt
) が便利だと思います。
他にも、エスケープキーを `
に設定する escape ``
オプションや、ctrl+^
に設定する escape ^^^
などが存在します。
Screen のドキュメントではエスケープキーのことを「コマンド文字」と呼ぶこともあります。
ウィンドウ1から起動
デフォルトでは、一番最初のスクリーンウィンドウは0です。ウィンドウ0を使わずに1から起動して欲しい場合、設定に以下の行を追加してください:
~/.screenrc
bind c screen 1 bind ^c screen 1 bind 0 select 10 screen 1
入れ子の screen セッション
screen セッションをネストすると固まってしまうことがあります。screen セッションの中で ssh セッションを開始して、さらに ssh セッションの中で、screen を起動した場合を考えてください。デフォルトでは、ctrl+a
コマンドに反応するのは最初に起動した (外側の) screen セッションだけです。内側の screen セッションにコマンドを送信するには、ctrl+a
a
と入力してからコマンドを押してください。例:
ctrl+a
a
d
内側の screen セッションをデタッチ。ctrl+a
a
K
内側の screen セッションを終了。
毎回シェルで Screen を起動する
Bash と Zsh の場合、エイリアスの前に .bashrc
または .zshrc
に以下のスニペットを追加してください:
~/.bashrc or ~/.zshrc
if [[ -z "$STY" ]]; then screen -xRR session_name fi
256色を使う
デフォルトでは、screen は8色のターミナルエミュレータを使います。他の色を使えるようにするには、多色対応しているターミナルを使用して term の値を適切に設定する必要があります。terminfo を使ってANSI エスケープコードの解釈方法が決められます。terminfo のデータベースにエントリが存在している必要があり、ncurses に一般的な記述子が含まれていて /usr/share/terminfo/
に保存されます。
まずは汎用の値を試してください:
~/.screenrc
term screen-256color
上記で上手く行かない場合、使用しているターミナルにあわせて設定してみてください。例えば xterm ベースのターミナルを使っている場合:
~/.screenrc
term xterm-256color
rxvt-unicode を使用する場合:
~/.screenrc
term rxvt-unicode-256color
上記の設定が駄目ならば最後の手段として、termcapinfo を設定してください:
~/.screenrc
attrcolor b ".I" # allow bold colors - necessary for some reason termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm' # tell screen how to set colors. AB = background, AF=foreground defbce on # use current bg color for erased chars
有益なステータスバー
デフォルトのステータスバーは情報が少なすぎます。以下のように設定すると良いでしょう:
~/.screenrc
hardstatus off hardstatus alwayslastline hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W} %c %{g}]'
あるいは、frodfrog のブログ に書かれている例:
~/.screenrc
hardstatus alwayslastline '%{= G}[ %{G}%H %{g}][%= %{= w}%?%-Lw%?%{= R}%n*%f %t%?%{= R}(%u)%?%{= w}%+Lw%?%= %{= g}][ %{y}Load: %l %{g}][%{B}%Y-%m-%d %{W}%c:%s %{g}]'
ステータスバーを上に表示するには:
~/.screenrc
hardstatus firstline
ウェルカムメッセージをオフにする
~/.screenrc
startup_message off
hardstatus 行を urxvt|xterm|aterm のウィンドウタイトルに動的に変える
hardstatus
行を通知を表示する caption
行に切り替えて、以下のように編集するだけです:
~/.screenrc
backtick 1 5 5 true termcapinfo rxvt* 'hs:ts=\E]2;:fs=\007:ds=\E]2;\007' hardstatus string "screen (%n: %t)" caption string "%{= kw}%Y-%m-%d;%c %{= kw}%-Lw%{= kG}%{+b}[%n %t]%{-b}%{= kw}%+Lw%1`" caption always
ターミナルエミュレータのタイトルに screen (0 bash)
と表示されるようになります。caption は日付と時刻を表示して、screen ウィンドウをカラー化します。
X のスクロール機能を使う
GNU Screen のスクロールバッファは ctrl+a
[
で読むことができますが、不便です。xterm や konsole などのスクロールバーを使うには、以下の行を追加してください:
~/.screenrc
termcapinfo xterm* ti@:te@
動作中のプログラムを screen にアタッチ
screen の外で起動したプログラムを中に持って行きたい場合、reptyr を使うことでプロセスの親を tty から screen に変えることができます。
プロセスの PID を取得してください (ps ax
を使えば取得できます)。reptyr の引数として取得した PID を入力して screen ウィンドウの中で実行してください:
$ reptyr <pid>
screen で別の bash プロンプトを設定
screen セッションで別の bash プロンプトを使いたい場合、以下を .bashrc
に追加してください [1]:
if [ -z $STY ] then PS1="YOUR REGULAR PROMPT" else PS1="YOUR SCREEN PROMPT" fi
ビジュアルベルを切る
以下の設定を使えば、screen はベル音声の代わりに画面の点滅を使うのを止めます。
~/.screenrc
vbell off
垂直・水平バーを表示しない
垂直バーを消すには:
$ ~/.screenrc
rendition so =00
背景・前景色をデフォルト (d) に設定して何も表示しない (" ") ようにします。水平バーを消すには:
~/.screenrc
caption string "%{03} "
トラブルシューティング
エディタのテキストが残るのを修正
nano などのテキストエディタを開いて閉じると、テキストがターミナルに残ってしまうことがあります。これを修正するには、以下を記述してください:
~/.screenrc
altscreen on
ウィンドウリストの Name カラムに "bash" としか表示されない
~/.screenrc
に以下を追加してください:
~/.screenrc
windowlist string "%4n %h%=%f"
参照
- GNU Screen ユーザーマニュアル
- Gentoo Wiki - screen のチュートリアル
- Arch フォーラム - .screenrc 設定とスクリーンショット
- Arch フォーラム - Regarding 256 color issue with urxvt
- MacOSX Hints - Automatically using screen in your shell
- Ratpoison - gnu screen ベースのウィンドウマネージャ
- Xpra - コマンドラインプログラムを screen がデタッチ・再アタッチするのと同じように、X プログラムをデタッチ・再アタッチできるユーティリティ