.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'

해커 부분이다~ 해야 하다한 줄에서는 화면을 벗어날 방법이 없습니다 .screenrc. 그런 다음 화면에 들어간 후( Ctrl+ ag) 한 번(또는 두 번)의 키 입력으로 레이아웃을 얻습니다.

g일반적으로 시스템 벨소리에 묶여 있으므로 놓치지 마세요. 하지만 원하는 키를 바인딩할 수 있습니다.

관련 정보