Вы обнаружили ошибку. И при этом неприятный.
Семейство команд макета
, похоже, зависит от управляющего терминала (для работы команды должен присутствовать TTY или PTS). Я могу воспроизвести проблему, не просматривая crontab
:
Я добавляю следующее к моему .screenrc
:
layout new lay1
split -v
layout new lay2
split -v
layout attach lay2
Запуск экран
напрямую дает мне макет :
screen
Но выполнение следующего не может найти макеты :
screen -dm && screen -r
В последней команде я все еще могу перечислить макеты, используя : layout show
, но, черт возьми, теперь это когда ошибка становится неприятной. Если я попытаюсь изменить макет (с помощью : layout next
или : layout prev
), экран попадет в бесконечный цикл.
Более того, поскольку двоичный файл screen
в моей системе является корнем SUID (мне нужна многопользовательская поддержка), ошибка становится еще хуже. После того, как пользовательский процесс был убит, корневой процесс запускает бесконечный цикл и в конечном итоге дает сбой. Возможность сбоя процесса SUID или даже просто возможность создания нескольких корневых процессов, высасывающих ресурсы ЦП в бесконечных циклах, очень опасна.
Я тестировал его на вашей версии экрана (4.3.0), а также на 4.5.0 (последняя версия), где ошибка все еще существует. Я собираю исходный код с помощью -DDEBUG
и сообщаю об ошибке команде разработчиков screen. Экран -DDEBUG
дает сбой:
ASSERT(l->l_cvlist != cv) failed file canvas.c line 294
Следовательно, вероятно, что бесконечный цикл пытается найти что-то в этом связанном списке и снова и снова дает сбой.
позволяет привязать
метод eval
. Поэтому вы можете добавить в свой .screenrc
что-то вроде:
bind g eval 'layout new default' 'split -v' 'resize 60%' 'split -h' 'layout select default'
Хакерская часть состоит в том, что должен быть в одной строке, screen не имеет никакого способа экранировать длинные строки в .screenrc
. Затем вы можете получить макет одним (а точнее, двойным) нажатием клавиши после выхода на экран ( Ctrl + a g ).
g обычно привязан к системному звонку, поэтому вы не должны пропустить его. Но вы можете привязать любую понравившуюся клавишу.