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
したがって、無限ループはその接続リストから何かを見つけようとし、失敗し続ける可能性が高くなります。
ハッカーソリューション
bind
Screenでは、この方法を使用できますeval
。したがって、.screenrc
以下を追加できます。
bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'
ハッカー部分です〜しなければならない1行では画面を離れる方法はありません.screenrc
。次に、画面に入った後(Ctrl+ ag)、1回(または2回)のキーストロークでレイアウトを取得します。
g通常、システムの着信音に縛られているので、お見逃しなく。ただし、必要なキーをバインドできます。