Назад | Перейти на главную страницу

Экран запуска (GNU) из сценария

Я хотел бы запустить какое-то приложение внутри сеанса экрана, но из сценария.
Без скрипта я бы просто запустил screen, затем открыл N окон с помощью crtl-a-c и выполнял программы в каждом из них.

Я пробовал следующее

screen -d -m -S test
screen -S test -X exec tail -f /var/log/messages
screen -S test -X screen
screen -S test -X exec tail -f /var/log/xinetd.log

Но когда я прикрепляю сессию, хвост не запускается. Если я присоединю сеанс сразу после screen -d -m -S startup и беги screen -S startup -X exec tail -f /var/log/messages с другого терминала работает.

Я что-то пропустил ?

редактировать после ответа AlexD:

Половина рабочего раствора

screen -d -m -S test tail -f /var/log/messages
screen -S test -X screen tail -f /var/log/xinetd.log

Связывание команды экрана (той, которая стоит после -X) с командой работает, в то время как exec не вероятно, потому что exec ожидает, что текущее окно будет определено, а при отсоединении экрана нет текущего. Благодаря AlexD для этого советы.

Но есть странный побочный эффект: когда программа останавливается (если вы присоедините сеанс экрана и crtl-c the tail или kill tail), окно экрана закроется.
Таким образом, поведение отличается от Crtl-A c и запустите команду
Другой побочный эффект заключается в том, что вы не можете связать 2 команды

В screen -S test -X screen command Команда - это то, что вам нужно для добавления окон в сеанс вашего демона, но не по указанным вами причинам. Это работает, потому что -X принимает команду экрана, а не команду оболочки, а команда экрана для создания окна называется, что сбивает с толку, экраном. Нет экранной команды exec. Также нет цепочки, если вы не создаете свою команду с помощью сценариев оболочки (например, этого: screen -S script -X screen sh -c 'command1; command2;').

Вызов screen -S test -X screen без команды бесполезен, потому что команда по умолчанию - это оболочка, и после того, как вы создали оболочку, у вас нет неинтерактивного (и неискусного) способа запуска команд внутри этой оболочки. Команду лучше запускать отдельно, без интерактивной оболочки. Побочным эффектом является то, что при выходе из команды экранное окно больше не имеет дочернего элемента и закрывается.

Теперь вы можете попросить screen держать окно открытым в любом случае после выхода команды. Использовать zombie экранную команду, чтобы включить это. Ваша последовательность выглядит так:

screen -d -m -S script
screen -S script -X zombie qr
screen -S script -X screen tail -f /var/log/messages
screen -S script -X screen tail -f /var/log/xinetd.log

Для интерактивного подключения:

screen -S script -r

И, наконец, вместо этого вы можете переписать эти -X-команды как скрипт screenrc.

Screenrc:

zombie qr
screen tail -f /var/log/messages
screen tail -f /var/log/xinetd.log

Сценарий:

screen -d -m -S script -c screenrc

Если вы хотите такой же эффект, как Ctrl-A c тогда вы должны использовать screen вместо того exec:

screen -S test -X screen tail -f /var/log/messages
screen -S test -X screen
screen -S test -X screen tail -f /var/log/xinetd.log

Кроме того, вы можете переместить свои команды выше в $HOME/.screenrc-younameit файл (без screen -S test -X префикс) и запускаем screen -c $HOME/.screenrc-younameit когда вы хотите создать конкретный сеанс экрана.

использует Byobu опция ?

Я делал то же самое сегодня вечером, я хотел открыть экран с несколькими предварительно открытыми файлами. Мне потребовалось время, чтобы разобраться во всем этом, но в конце концов я пришел к следующему, который, кажется, работает довольно хорошо:


#1/bin/sh 
screen -d -m -S CS140 
screen -S CS140 -X screen -t thread.c 
screen -p 1 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.c\015"'
screen -S CS140 -X screen -t thread.h 
screen -p 2 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/thread.h\015"'
screen -S CS140 -X screen -t palloc.c 
screen -p 3 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/palloc.c\015"'
screen -S CS140 -X screen -t intr-stubs.h 
screen -p 4 -S CS140 -X eval 'stuff "vim cs140-ps2/src/threads/intr-stubs.h\015"'
screen -S CS140 -X screen -t pagedir.c 
screen -p 5 -S CS140 -X eval 'stuff "vim cs140-ps2/src/userprog/pagedir.c\015"'
screen -r -d CS140 

Это создаст шесть разных экранов, при этом на экранах 1-5 будут открыты различные файлы. Я не знаю всей специфики, но «материал» по сути говорит screen, что следующий цитируемый текст не является экранной командой. Затем «eval» оценивает все, что содержится в кавычках. Без этого screen -p 4 -S CS140 -X stuff "vim cs140-ps2/src/threads/intr-stubs.h\015" просто передает цитируемый текст, не выполняя его. Eval прочитает '\ 015' как новую строку и, таким образом, выполнит предыдущий текст.

Что касается других деталей, screen -p 1 -S CS140 -X CMD сообщает оболочке, что нужно отправить CMD в первое окно сеанса экрана с именем CS140.

Надеюсь, это поможет!