GNU Screen

提供: ArchWiki
2017年10月12日 (木) 23:15時点におけるKusakata.bot (トーク | 投稿記録)による版 (文字列「Tips and tricks」を「ヒントとテクニック」に置換)
ナビゲーションに移動 検索に移動

関連記事

GNU Screen はテキストプログラムとシェルを分離させることができるラッパーです。Screen を使うことで、例えば、X のターミナルでテキストプログラムを起動して、X を終了し、プログラムを使い続けることなどが可能になります。

インストール

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 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

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 ReadlineBash などのシェルでは ctrl+abeginning-of-line コマンドにマッピングされていることが挙げられます。

エスケープキーは ~/.screenrcescape オプションで変更できます。あるいは 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 セッションを終了。

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
ノート: /usr/share/terminfo/r/rxvt-unicode-256colorrxvt-unicode-terminfo に入っています。このパッケージは rxvt-unicode の依存パッケージとしてインストールされます。ただし、SSH を介してサーバーにログインして screen を実行している場合、terminfo ファイルがサーバー側に存在しない可能性があります。その場合、サーバーに /usr/share/terminfo/r/rxvt-unicode-256color をコピーして ~/.terminfo に保存することを推奨します。

上記の設定が駄目ならば最後の手段として、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
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 に変えることができます。

公式リポジトリから reptyr パッケージをインストールしてください。

プロセスの 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

トラブルシューティング

screen で起動した時に Midnight Commander がフリーズするのを修正

ときどき 古い gpm のバグ が顔を出すことがあります。mc を screen で起動すると、スクリーンウィンドウが固まってしまいます。mc を起動する前に gpm デーモンを終了してみてください。もしくは /etc/rc.conf で無効化してください。

エディタのテキストが残るのを修正

nano などのテキストエディタを開いて閉じると、テキストがターミナルに残ってしまうことがあります。これを修正するには、以下を記述してください:

~/.screenrc
altscreen on

ウィンドウリストの Name カラムに "bash" としか表示されない

~/.screenrc に以下を追加してください:

~/.screenrc
windowlist string "%4n %h%=%f"

参照