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.