.screenrcの画面レイアウト操作が機能しません。

.screenrcの画面レイアウト操作が機能しません。

screen私はしばらく(v4.03.01)を使っていて、本当に好きでした。私は私を大幅にカスタマイズしましたが、.screenrc奇妙な理由でレイアウトコマンドは起動時に実行されません。私がこれを行うと、source ~/.screenrc彼らはそれを受け入れ、私のレイアウトは私が望むように変更されます。画面を起動するとき、aがその画面が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

答え1

エラーが見つかりました。それは本当に不快なことです。

コマンドシリーズは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 nextを使用して:layout prev)、画面が無限ループに陥ります。

また、screen私のシステムのバイナリはSUIDルート(マルチユーザーサポートが必要です)なので、エラーがさらに深刻になります。ユーザープロセスが終了すると、ルートプロセスは無限ループを開始し、最終的にクラッシュします。 SUIDプロセスがクラッシュする可能性、または無限ループからCPUリソースを吸い込む複数のルートプロセスを作成する機能は非常に危険です。

画面バージョン(4.3.0)と4.5.0(最新バージョン)でテストしましたが、エラーはまだ存在します。ソースコードをコンパイルし、-DDEBUGバグを画面開発チームに報告しています。画面に-DDEBUG不具合が発生し、以下が表示されます。

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

したがって、無限ループはその接続リストから何かを見つけようとし、失敗し続ける可能性が高くなります。

ハッカーソリューション

bindScreenでは、この方法を使用できますeval。したがって、.screenrc以下を追加できます。

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

ハッカー部分です〜しなければならない1行では画面を離れる方法はありません.screenrc。次に、画面に入った後(Ctrl+ ag)、1回(または2回)のキーストロークでレイアウトを取得します。

g通常、システムの着信音に縛られているので、お見逃しなく。ただし、必要なキーをバインドできます。

関連情報