SCREENの使い方メモ (2020.3.16, 2020.3.22追記, 2021.10.14修正)

Summary

リモートでのサーバ作業のために設定したのでまとめた
最近の若者はscreenを使っていない人もいると聞いて布教活動も兼ねて
説明の最後の方にある設定を全部真似していれば、任意の作業ディレクトリで’sy’と入力すると複数のレイアウトをあらかじめ設定したscreenが立ち上がります。
作業中断は’Ctl+z Ctl+d’、完全に終了するには’Ctl+z Ctl+\’。

screen icon

Install

macOSでのInstall

macOS High Sierraにはscreen 4.00.3が入っていたが垂直方向の画面分割はできない。 4.01.00以降をinstallすれば垂直方向の分割もできるようになる

$ brew update
$ brew install screen

UbuntuでのInstall

Ubuntu 16.04.6には4.03.01が入っていたので垂直方向の画面分割も可能

$ apt-get install screen

起動/確認

Command 動作
session 通常起動
screen -ls 既にscreenセッションがあるか確認
screen -S <name> セッション名を指定して開く
screen -r 既に存在するセッションに接続
screen -r <name> セッション名を指定して再開
screen -D -R 既存セッションがあれば接続なければ新規作成
screen -d -r セッションがあれば接続する必要なら切断して再接続

終了/中断

キー入力 動作
exit<cr> 現在のWindowを終了
screen -d Detatch screen
Ctl+a Ctl+d Detatch screen
Ctl+a D D Detach and logout
Ctl+a \ 全てのwindowをexitしてscreenも終了

Window操作

キー入力 動作
Ctl+a Ctl+c 新規Windowを作成し表示
Ctl+a A 現在のWindowに名前をつける・編集する
Ctl+a w Windowの名前の一覧から選択 (*が今のWindowで-が直前のWindow)
Ctl+a <num> 指定した番号[0-9]のWindow画面を表示
Ctl+a - 現在のWindowをブランク表示にする
Ctl+a ’ 番号もしくは“Ctl+a A”でつけた名前を入力して表示
Ctl+a " Windowの一覧を表示しカーソルで選択
Ctl+a Ctl+a 直前のWindowを表示 (2枚なら切り替え)
Ctl+a <space> 次の番号のWindow画面を表示 (Ctl+a nと同じ)
Ctl+a Ctl+n 次の番号のWindowを表示
Ctl+a Ctl+p 前の番号のWindowを表示
Ctl+a F terminalの表示サイズをwindowサイズにあわせる

画面操作

キー入力 動作
Ctl+a S Windowを水平方向に上下分割
Ctl+a | Windowを垂直方向に左右分割
Ctl+a <tab> 分割したWindowの移動
screen -X resize +N フォーカス中のWindowを+N行増やす
(垂直分割の場合は領域をN文字増やす)
Ctl+a Q Window分割時にフォーカス中のWindow以外を消去
Ctl+a X Window分割時にフォーカス中のWindowを消去
Ctl+a [ 画面のバッファスクロール・コピー (<ESC>でキャンセル)
Ctl+a ] ペースト
Ctl+l 画面が乱れた時に表示をクリアする (シェルの機能)
Ctl+a Ctl+x 画面ロック(パスキーを入れて解除)

独自設定の.screenrcと使い方

先人のいろいろな設定を参考にさせていただいています。

サンプル.screenrc
#
# sample .screenrc
#

escape \233\233
zombie

hardstatus on
defbce on

# Protection from attacks
multiuser off
idle off

# Init params
defutf8 on
defencoding utf8
encoding utf8 uft8
vbell off
autodetach on
startup_message off
deflogin off
autonuke on
defscrollback 0
altscreen on

## set $TERM env
term screen

# change screen ctrl key to C-z
escape ^Z^Z # C-z C-z : send ^Z to process
bind 'Z' suspend # C-z z, C-z Z: suspend screen
bind 'z' suspend
bind 'K' kill # kill current screen

#
# settings for window splitting
#

# Resize window
bind ^r eval 'command -c resize' 'echo "Resize window"'
bind r eval 'command -c resize' 'echo "Resize window"'
bind -c resize h eval 'command -c resize' 'resize -h -1'
bind -c resize l eval 'command -c resize' 'resize -h +1'
bind -c resize j eval 'command -c resize' 'resize -v +1'
bind -c resize k eval 'command -c resize' 'resize -v -1'
bind -c resize ^h eval 'command -c resize' 'resize -h -1'
bind -c resize ^l eval 'command -c resize' 'resize -h +1'
bind -c resize ^j eval 'command -c resize' 'resize -v +1'
bind -c resize ^k eval 'command -c resize' 'resize -v -1'
bind -c resize n eval 'command -c resize' 'resize -v +1'
bind -c resize p eval 'command -c resize' 'resize -v -1'
bind -c resize ^n eval 'command -c resize' 'resize -v +1'
bind -c resize ^p eval 'command -c resize' 'resize -v -1'
bind -c resize m eval 'command -c resize' 'resize max'
bind -c resize ^m eval 'command -c resize' 'resize max'
bind -c resize f eval 'fit' 'fit'
bind -c resize ^f eval 'fit' 'fit'

#
# settings for layout
#

# trigger for layout sub-commands
bind ^y eval 'command -c layout' 'layout show'
bind y  eval 'command -c layout' 'layout show'

# create/remove layout
bind -c layout c eval 'layout new'    'layout show'
bind -c layout X eval 'layout remove' 'layout show'

# change the current layout title or number
bind -c layout A colon 'layout title '
bind -c layout N colon 'layout number '

# switch to the layout identified by number or title (not prefix of a title)
bind -c layout \' eval 'layout select' 'layout show'

# switch to other layout
bind -c layout n eval 'layout next'     'layout show'
bind -c layout p eval 'layout prev'     'layout show'
bind -c layout 0 eval 'layout select 0' 'layout show'
bind -c layout 1 eval 'layout select 1' 'layout show'
bind -c layout 2 eval 'layout select 2' 'layout show'
bind -c layout 3 eval 'layout select 3' 'layout show'
bind -c layout 4 eval 'layout select 4' 'layout show'
bind -c layout 5 eval 'layout select 5' 'layout show'
bind -c layout 6 eval 'layout select 6' 'layout show'
bind -c layout 7 eval 'layout select 7' 'layout show'
bind -c layout 8 eval 'layout select 8' 'layout show'
bind -c layout 9 eval 'layout select 9' 'layout show'
bind -c layout f eval 'fit' 'fit'
bind -c layout ^f eval 'fit' 'fit'

# continuous switch to other layout
bind -c layout ^N eval 'layout next' 'command -c layout' 'layout show'
bind -c layout ^P eval 'layout prev' 'command -c layout' 'layout show'
bind -c layout ^n eval 'layout next' 'command -c layout' 'layout show'
bind -c layout ^p eval 'layout prev' 'command -c layout' 'layout show'

# change window focus
bind -c layout h eval 'focus left' 'command -c layout' 'layout show'
bind -c layout l eval 'focus right' 'command -c layout' 'layout show'
bind -c layout j eval 'focus up' 'command -c layout' 'layout show'
bind -c layout k eval 'focus down' 'command -c layout' 'layout show'
bind -c layout ^h eval 'focus left' 'command -c layout' 'layout show'
bind -c layout ^l eval 'focus right' 'command -c layout' 'layout show'
bind -c layout ^j eval 'focus up' 'command -c layout' 'layout show'
bind -c layout ^k eval 'focus down' 'command -c layout' 'layout show'

# Change focus with Ctl-z Ctl-o
bind ^o focus next
bind o focus next


zombie kr

bind w windowlist -b
defscrollback 8192
termcapinfo xterm* ti@:te@


markkeys h=^B:l=^F:$=^E:^U=^Z:^D=^V

shelltitle '$ |shell'

# message display time
msgwait 3
msgminwait 2

# display status
hardstatus alwayslastline "%?%h%:#%n %t @%H)%? %{= dd}%-037= %{= wB}[%l] %Y-%m-%d %02c:%s"
caption always "%{=r dd}%-Lw%40L>%?%F%{+b kG}%:[%{=r dd}%? %n%f %t %?%F%{-}%:]%?%+Lw"

# split line color
sorendition "+rb .R"

## change directory to home
#chdir
サンプル.screenrc.layout
#
# .screenrc.layout
#

source ~/.screenrc

# create window
screen 0
screen 1
screen 2
screen 3
screen 4

# create layout
layout new 0:layout0:single
layout new 1:layout1:double
layout new 2:layout2:horizontal
layout new 3:layout3:vertical


# setup layout0
layout select layout0:single
select 0
focus top


# setup layout1
layout select layout1:double
select 0
split
focus bottom
select 1
resize 20%
focus top


# setup layout2
layout select layout2:horizontal
select 0
split
focus down
select 1
split -v
split -v
split -v
focus next
select 2
focus right
select 3
focus bottom
select 4
resize -v -l 20%
focus top

# setup layout3
layout select layout3:vertical
split -v
select 0
focus right
split
split
select 1
focus down
select 2
focus down
select 3
split -v
focus bottom
select 4
focus top
focus left

#select 0
#stuff "echo here is current window\n"

# select layout0
layout select 0
layout show

基本操作

キー入力 動作
Ctl+z \ screenを終了
Ctl+z d screenをdetatchして終了
Ctl+z Ctl+d Ctl+d screenをdetachしてlogout終了
Ctl+z Ctl+z Ctl+zをプロセスに送信 (Ctl+z zやCtl+z Zはsuspendなので注意)
Ctl+z <space> focusされた区画に次のWindow画面を表示 (Ctl+z nと同じ)
Ctl+z <num> focusされた区画に指定した番号[0-9]のwindowを表示
Ctl+z " Windowの一覧を表示しカーソルで選択
Ctl+z Ctl+r Resize操作モード
Ctl+z Ctl+y Layout操作モード
Ctl+z Ctl+o 次のWindowにfocusを移動 (Ctl+z <tab>と同じ)
Ctl+z F terminalの表示サイズをwindowサイズにあわせる
Ctl+z [ 画面のバッファスクロール・コピー (<ESC>でキャンセル)
Ctl+z ] ペースト
Ctl+l 画面が乱れた時に表示をクリアする (シェルの機能)
Ctl+z Ctl+x 画面ロック(パスキーを入れて解除しないと操作できなくする)
Ctl+z Ctl+c 新しいwindowを作成して表示
Ctl+z Ctl+k 現在のwindowを消去
Ctl+z A. 現在のwindowに名前をつける

Resizeモード

Ctl+z Ctl+rでresizeモードに入った後のキー操作 (<ESC>やCtl+<space>で解除)

キー入力 (Ctl+z Ctl+rに続けて) 動作
Ctl+p, Ctl+n focusのある領域の縦幅を広げたり狭めたりする
Ctl+h, Ctl+j, Ctl+k, Ctl+l focusのある領域の縦幅や横幅を広げたり狭めたりする
Ctl+m focusのある領域の縦幅を最大化する
Ctl+f terminalの表示サイズをwindowサイズにあわせる
(Ctl+z Fと同じ)

Layoutモード

Ctl+z Ctl+yでlayoutモードに入った後のキー操作 (<ESC>やCtl+<space>で解除)

キー入力 (Ctl+z Ctl+yに続けて) 動作
<num> 番号指定したlayoutに移動 [0-3]
Ctl+n 次のlayoutに移動
Ctl+p 前のlayoutに移動
Ctl+h, Ctl+j, Ctl+k, Ctl+l windowのfocusを移動 (左, 上, 下, 右)
Ctl+f terminalの表示サイズをwindowサイズにあわせる
(Ctl+z Fと同じ)
A layoutにtitle文字列をつける
N layoutにnumberをつける

.screenrc.layoutに記述してある4つのlayout設定が起動時に自動生成される。
Ctl+z Ctl+y [0-3]で以下の4枚のlayoutを切り替える my layout0 my layout1 my layout2 my layout3

.bashrcの設定

デフォルトではログファイル等は/tmp/screen/に作成されるが、 サーバがリブートされてもログファイルなどがクリアされないようにする .bash_profileに以下を追加

export SCREENDIR=/User/username/etc/.screen/

.screenディレクトリを作成してアトリビュート設定

$ cd /User/username/etc/
$ mkdir .screen
$ chmod 700 .screen

.bashrcに起動を楽にするalias設定を追加
‘s’は同一ディレクトリで開始したscreenセッションが既にあればそれをattachして開始する なければセッション名を現在のディレクトリ名にして新規に起動 ’sy’では’s’の動作に加えてlayoutをあらかじめ登録した状態で起動 (同一ディレクトリで別のscreenセッションを新規に立ち上げる場合は’syn’) 任意の作業ディレクトリに移って、’sy’で起動して’Ctl+z Ctl+\’で終了するのが便利

alias s=screen_up
alias sy=screen_layout
alias syn=screen_newlayout

function screen_up(){
    name=${1:-${PWD##*/}}
    screen -x $name || screen -r $name || screen -S $name
}

function screen_layout(){
    name=${1:-${PWD##*/}}
    screen -x $name || screen -r $name || screen -c ~/.screenrc.layout -S $name
}

function screen_newlayout(){
    name=${1:-${PWD##*/}}
    screen -c ~/.screenrc.layout -S $name
}

参考

Back to Index