Ubuntu

.screenrc 中的螢幕佈局操作不起作用

  • February 14, 2017

我已經使用screen(v4.03.01) 一段時間了,真的很喜歡它。我已經對我.screenrc的 . 如果我source ~/.screenrc,他們會接受並且我的佈局會更改為我想要的。值得注意的是,我以與所屬crontab @reboot使用者相同的使用者開始螢幕。.screenrc

為什麼會發生這種情況,我該如何解決?

這是我的.screenrc

startup_message off
altscreen on
bell_msg "Window % wants your attention!^G"
vbell off
sorendition "= KW"
caption string "%{KW}"
defscrollback 5000
# backtick 0: get cpu usage
backtick 0 0 0 sh $HOME/.screenrc.cpu
# backtick 1: get ram usage
backtick 1 1 1 $HOME/.screenrc.ram

hardstatus alwayslastline
hardstatus string "%{= Kk}[ %{= KW}%H%{-} ] CPU: %{= KW}%0` %{-}RAM: %{= KW}%1` %{-}< %L=%-w%40L>%{= wk}%n %t%{-}%+w%-21= > [ %{= KW}%0c%{-} | %{= KW}%0d %M%{-} ]"
# %{= Kk} : set colors to black on bright black
# [       : literal
# %{= KW} : set colors to bright white on bright black
# %H      : hostname
# %{-}    : reset colors to previous (black on bright black)
# ] CPU:  : literal
# %{= KW} : set colors to bright white on bright black
# %0`     : execute backtick 0: cpu usage
# %{-}    : reset colors to previous (black on bright black)
# RAM:    : literal
# %{= KW} : set colors to bright white on bright black
# %1`     : execute backtick 1: ram usage
# %{-}    : reset colors to previous (black on bright black)
# <       : literal
# %L=     : padding anchor: prevents truncation of previous
# %-w     : previous windows
# %40L>   : padding anchor: next element is at 40% of the space between previous and next anchors
# %{= wk} : set colors to black on white
# %n      : window number
# %t      : window title
# %{-}    : reset colors to previous (black on bright black)
# %+w     : next windows
# %-21=   : padding anchor: next character is 21 characters from the right of the screen
# > [     : literal
# %{= KW} : set colors to bright white on bright black
# %c      : time (24h)
# %{-}    : reset colors to previous (black on bright black)
# |       : literal
# %{= KW} : set colors to bright white on bright black
# %d      : day of month
# %M      : three-letter month
# %{-}    : reset colors to previous (black on bright black)
# ]       : literal

# bind function keys (f1-f10) to window
bindkey "^[OP" select 0
bindkey "^[OQ" select 1
bindkey "^[OR" select 2
bindkey "^[OS" select 3
bindkey "^[[15~" select 4
bindkey "^[[17~" select 5
bindkey "^[[18~" select 6
bindkey "^[[19~" select 7
bindkey "^[[20~" select 8
bindkey "^[[21~" select 9

bindkey "^[[1;5D" prev # ctrl-left to switch to previous window
bindkey "^[[1;5C" next # ctrl-right to switch to next window
bindkey "^[[1;5B" focus # ctrl-down to switch to next region
bind = resize +1 #ctrl-= to embiggen region
bind - resize -1 #ctrl-- to shrink region

screen -t shell 0 bash
screen -t shell 1 bash
screen -t shell 2 bash
screen -t shell 3 bash
screen -t shell 4 bash
screen -t shell 5 bash
screen -t root 6 su -
screen -t something1 7 bash
screen -t something2 8 bash
screen -t something3 9 bash

#layout stuff
layout new default
layout autosave on
split -v
resize 60%
split -h
resize 15%
select 7
focus down
select 0
focus right
split -h
select 8
focus down
select 9
focus left
focus up
layout save default
layout attach default
layout select default

你發現了一個錯誤。還有一個討厭的。

layout命令系列似乎依賴於控制終端(必須存在 TTY 或 PTS 才能使命令工作)。我可以在不經歷的情況下複製問題crontab

我將以下內容附加到我的.screenrc

layout new lay1
split -v
layout new lay2
split -v
layout attach lay2

直接執行screen讓我得到佈局:

screen

但是執行以下操作無法找到佈局

screen -dm && screen -r

在最後一個命令中,我仍然可以使用 列出佈局:layout show,但是該死的,現在是錯誤變得令人討厭的時候了。如果我嘗試更改佈局(使用:layout nextor :layout prev),螢幕會陷入無限循環。

此外,由於screen我係統上的二進製文件是 SUID root(我需要多使用者支持),因此錯誤變得更糟。一旦使用者程序被殺死,根程序就會開始無限循環並最終崩潰。使 SUID 程序崩潰的可能性,或者甚至只是創建多個根程序以無限循環吸取 CPU 資源的能力,都是非常危險的。

我已經在您的螢幕版本(4.3.0)以及仍然存在錯誤的 4.5.0(最新版本)上對其進行了測試。我正在編譯原始碼-DDEBUG並將錯誤報告給 screen 的開發團隊。-DDEBUG螢幕失敗並顯示:

ASSERT(l->l_cvlist != cv) failed file canvas.c line 294

因此,無限循環很可能會嘗試在該鍊錶中查找某些內容並一遍又一遍地失敗。

黑客解決方法

螢幕允許您使用bindeval方法。因此,您可以添加以下內容.screenrc

bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'

駭人聽聞的部分是它必須在單行上,螢幕沒有任何方法可以在.screenrc. 然後,您可以在進入螢幕 ( Ctrl+ a``g) 後通過單次(以及雙次)擊鍵獲得您的佈局。

g通常綁定到系統鈴,所以你不應該錯過它。但是你可以綁定任何你喜歡的鍵。

引用自:https://unix.stackexchange.com/questions/344522