Summary
リモートでのサーバ作業のために設定したのでまとめた
最近の若者はscreenを使っていない人もいると聞いて布教活動も兼ねて
説明の最後の方にある設定を全部真似していれば、任意の作業ディレクトリで’sy’と入力すると複数のレイアウトをあらかじめ設定したscreenが立ち上がります。
作業中断は’Ctl+z Ctl+d’、完全に終了するには’Ctl+z Ctl+\’。
macOS High Sierraにはscreen 4.00.3が入っていたが垂直方向の画面分割はできない。 4.01.00以降をinstallすれば垂直方向の分割もできるようになる
$ brew update
$ brew install screen
Ubuntu 16.04.6には4.03.01が入っていたので垂直方向の画面分割も可能
$ apt-get install screen
Command | 動作 |
---|---|
session | 通常起動 |
screen -ls | 既にscreenセッションがあるか確認 |
セッション名を指定して開く | |
screen -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も終了 |
キー入力 | 動作 |
---|---|
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枚なら切り替え) |
次の番号の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の移動 |
フォーカス中のWindowを+N行増やす (垂直分割の場合は領域をN文字増やす) |
|
Ctl+a Q | Window分割時にフォーカス中のWindow以外を消去 |
Ctl+a X | Window分割時にフォーカス中のWindowを消去 |
Ctl+a [ | 画面のバッファスクロール・コピー (<ESC>でキャンセル) |
Ctl+a ] | ペースト |
Ctl+l | 画面が乱れた時に表示をクリアする (シェルの機能) |
Ctl+a Ctl+x | 画面ロック(パスキーを入れて解除) |
先人のいろいろな設定を参考にさせていただいています。
#
# 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
#
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して終了 |
screenをdetachしてlogout終了 | |
Ctl+z Ctl+z | Ctl+zをプロセスに送信 (Ctl+z zやCtl+z Zはsuspendなので注意) |
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に名前をつける |
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と同じ) |
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を切り替える
デフォルトではログファイル等は/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
}