operações de layout de tela em .screenrc não funcionando

2

Estou usando screen (v4.03.01) há algum tempo e gosto muito dele. Eu personalizei muito meu .screenrc , mas por algum motivo estranho os comandos de layout não aceitam o lançamento. Se eu source ~/.screenrc , eles pegam e meu layout muda para o que eu quero. É importante observar que eu inicio a tela com um crontab @reboot como o mesmo usuário ao qual o .screenrc pertence.

Por que isso acontece e como eu corrijo isso?

Aqui está o meu .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
    
por Bab 13.02.2017 / 02:00

1 resposta

2

Você encontrou um bug. E um desagradável nisso.

A família de comandos layout parece ser dependente de um terminal de controle (um TTY ou PTS deve estar presente para o comando funcionar). Eu posso replicar o problema sem passar por crontab :

Acrescento o seguinte ao meu .screenrc :

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

A execução de screen me mostra diretamente o layout:

screen

Mas a seguinte falha ao encontrar os layouts :

screen -dm && screen -r

No último comando eu ainda posso listar os layouts usando :layout show , mas, porra, agora é quando o bug se torna desagradável. Se eu tentar alterar o layout (com :layout next ou :layout prev ), a tela entrará em um loop infinito.

Além disso, como o binário screen no meu sistema é raiz SUID (preciso de suporte multiusuário), o bug fica pior. Depois que o processo do usuário é eliminado, o processo raiz inicia um loop infinito e, eventualmente, falha. Uma possibilidade de travar um processo de SUID, ou mesmo apenas a capacidade de criar vários processos de raiz sugando recursos da CPU em loops infinitos, é muito perigosa.

Eu testei em sua versão da tela (4.3.0) e também em 4.5.0 (a versão mais recente) onde o bug ainda existe. Eu estou no processo de compilar a fonte com -DDEBUG e reportar o bug para a equipe de desenvolvimento da tela. A tela -DDEBUG falha com:

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

Portanto, é provável que o loop infinito tente encontrar algo nessa lista vinculada e falhe repetidamente.

Solução alternativa Hacky

A tela

permite que você use bind o método eval . Portanto, você pode adicionar ao seu .screenrc algo como:

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

A parte hacky é que deve estar em uma única linha, a tela não tem como escapar de linhas longas em .screenrc . Então você pode pegar seu layout com um simples toque de tecla (bem duplo) depois de entrar na tela ( Ctrl + a g ).

g é normalmente ligado ao sino do sistema, então você não deve perder. Mas você pode ligar qualquer tecla que quiser.

    
por 14.02.2017 / 16:33