Запустити (GNU) екран із сценарію


11

Я хотів би запустити якусь програму всередині екранного сеансу, але зі сценарію.
Без сценарію я б просто запустив екран, потім відкрив 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 завжди закінчується , коли команда , з якою був запущений кінці - це нормальна особливість інструменту :) ..so при запуску screen top, коли ви кидаєте top, screenпіде теж
Warren

Так, я тепер це, тому я спробував запустити екран як deamon, тоді використовую exec, потім використовую команду screen, щоб відкрити нове вікно (запустивши оболонку). Я також спробував tu prepend bash між exec і хвостом або між екраном і скажіть, але жодне не працює
радіус

Відповіді:


14

screen -S test -X screen commandКоманда, що вам потрібно додати вікна в свій демон сесії, але не з тих причин , які ви даєте. Це працює тому, що -X приймає екранну команду, а не командну оболонку, а команда екрана для створення вікна називається, заплутаною, екраном. Немає екранної команди exec. Не існує жодного ланцюжка, якщо ви не побудуєте свою команду, використовуючи сценарій оболонки (наприклад:) 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

Так, я знаю, що -X приймає екранну команду, що я маю на увазі, коли я сказав "Зв'язати команду екрана (одна після -X)" сторінки, але, як ви вже сказали, немає можливості змусити його працювати так, як хотілося в неінтерактивному режимі. У будь-якому випадку з рішенням AlexD і командою зомбі додайте, що я отримав те, що хочу! Дякую
радіус

@Tobu: +200 за згадування зомбі! Я б у кінцевому рахунку ніколи не помічав цього в цьому жахливому посібнику!
лози

6

Якщо ви хочете такий же ефект, як Ctrl-A cтоді, ви повинні використовувати screenзамість exec:

екран -S тест -X хвіст екрану -f / var / log / повідомлення
екран -S тест -X екран
екран -S тест -X хвіст екрану -f /var/log/xinetd.log

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


Ctrl-A c знаходиться в моєму 3-му рядку, я думаю, що exec не працює, тому що exec виконує команду в поточних вікнах, яка може бути не визначена, коли екран знімається. Ваш обхідний ланцюговий екран і команда хороша, я повинен був би спробувати це! Я додам свою відповідь, тому що у вашій відповіді бракує створення сеансу та є марний рядок (2-е, пропуск 1 вікна)
радіус

Насправді це не працює, як очікувалося, вікна закриваються, як тільки програма зупиняється. якщо ви зробите екран -S тест -X екран ls, вікно закриється, і ви ніколи не побачите результат
радіус

1

використовує byobu варіант?


Я просто спробував це, я не бачу, як це може допомогти, але якщо у вас є робоче рішення з byobu, це може бути нормально, я вважаю за краще рішення лише для екрана, але використовувати додавання краще, ніж не мати рішення!
радіус

1

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


#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".

Сподіваюся, що це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.