Я хотел бы запустить некоторое приложение в сеансе экрана, но из сценария.
Без скрипта я бы просто запускал экран, затем открывал N окон с помощью crtl-ac и запускал программы в каждом из них.
Я попробовал следующее
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 команды
источник
screen
всегда завершается, когда запускается команда, с которой он был запущен - это обычная особенность инструмента :) .. так что если вы запускаетеscreen top
, когда вы выходитеtop
,screen
тоже завершаетсяОтветы:
Команда
screen -S test -X screen command
- это то, что вам нужно, чтобы добавить окна в сеанс демона, но не по указанным вами причинам. Это работает, потому что -X принимает команду экрана, а не команду оболочки, и команда экрана для создания окна вызывается, до смешного, экраном. Нет экранной команды exec. Также нет никакой цепочки, если вы не строите свою команду, используя сценарии оболочки (как это :)screen -S script -X screen sh -c 'command1; command2;'
.Вызов
screen -S test -X screen
без команды бесполезен, потому что команда по умолчанию - это оболочка, и как только вы породили оболочку, у вас не будет неинтерактивного (и не хитрого) способа запуска команд внутри этой оболочки. Команду лучше запускать отдельно, без интерактивной оболочки. Побочным эффектом является то, что когда команда завершается, окно экрана больше не имеет дочернего элемента и закрывается.Теперь вы можете попросить экран держать окно открытым в любом случае после завершения команды. Используйте
zombie
экранную команду, чтобы включить это. Ваша последовательность выглядит так:Для подключения в интерактивном режиме:
И, наконец, вы можете переписать эти команды -X вместо сценария screenrc.
Screenrc:
Автор сценария:
источник
Если вы хотите такой же эффект, как
Ctrl-A c
тогда, вы должны использоватьscreen
вместоexec
:Кроме того, вы можете переместить свои команды выше в
$HOME/.screenrc-younameit
файл (безscreen -S test -X
префикса) и запустить,screen -c $HOME/.screenrc-younameit
когда вы хотите создать определенный сеанс экрана.источник
использует byobu вариант?
источник
Я делал то же самое сегодня вечером, я хотел открыть экран с несколькими предварительно открытыми файлами. Мне потребовалось некоторое время, чтобы понять все это, но я наконец-то нашел следующее, которое, кажется, работает довольно хорошо:
Это создаст шесть разных экранов, с экранами 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».Надеюсь, это поможет!
источник