Вопрос: Экран Run (GNU) из сценария


Я хотел бы запустить какое-то приложение в сеансе экрана, но из сценария.
Без скрипта я бы просто запустил экран, затем откройте 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 хвостом или убиваете хвост), экранное окно закрывается.
Таким образом, поведение не такое же, как Crtl-A c, и выполните команду
Другим побочным эффектом является то, что вы не можете перекодировать 2 команды


10
2018-06-29 09:27


Источник


screen  всегда завершается, когда команда с которой была запущена, заканчивается - это обычная функция инструмента :) ..so, если вы запускаете screen top, когда вы уходите top, screen тоже уйдет - warren
Да, я теперь это, поэтому я попробовал запустить экран в качестве deamon, а затем использовать exec, а затем использовать команду экрана, чтобы открыть новое окно (lauching shell). Я также попробовал tu preend bash между exec и tail или между экраном и сказать, но ни один из них не работает - radius


Ответы:


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

призвание screen -S test -X 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

12
2017-07-01 23:01



Да, я знаю, что -X принимает команду экрана, что я имею в виду, когда я сказал «Целевая команда экрана (после -X)» («О'кей, это не совсем понятно»), но есть команда exec exec, посмотрите на человека но, как вы сказали, нет способа заставить его работать как раз в неинтерактивном режиме. Во всяком случае с решением AlexD и вы добавили команду зомби, я получил то, что хочу! спасибо - radius
@Tobu: +200 для упоминания зомби! Я бы в конце концов не заметил этого в этом страшном руководстве! - vines


Если вы хотите получить тот же эффект, что и 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 когда вы хотите создать конкретный сеанс экрана.


6
2018-06-29 10:24



Ctrl-A c находится в моей третьей строке, я думаю, что exec не работает, потому что exec запускает команду в текущих окнах, которые не могут быть определены при отсоединении экрана. Ваш обходной экран и команда хороши, я должен был попробовать! Я добавлю себе ответ, потому что в вашем ответе отсутствует создание сеанса и есть бесполезная строка (вторая, пропуская 1 окно) - radius
На самом деле он работает не так, как ожидается, окна закрываются, как только программа останавливается. если вы сделаете экран -S test -X screen ls, окно закроется, и вы никогда не увидите результат - radius


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


1
2017-07-01 12:35



Я просто попробовал, я не понимаю, как это могло бы помочь, но если у вас есть рабочее решение с byobu, это может быть хорошо, я предпочитаю только экранное решение, но с помощью добавления лучше, чем без решения! - radius


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


#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 открывают различные файлы. я   не знаю всех особенностей, но «материал» по сути говорит экрану следующий цитируемый текст   не является командой экрана. Затем «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».

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


1
2018-02-18 12:56