Створіть екран і запустіть команду, не приєднуючись


29

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

Однак у мене виникають труднощі з цим. Я можу створити екран правильно, не додаючи його screen -d -m -S screen_name. Однак якщо я запускаю команду на основі:

screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''

при цьому echo -ne '\ 015' буде обмотано задніми позначками, а не одинарними цитатами. Він повинен імітувати користувача, натискаючи клавішу введення, оскільки команди, які я використовую, переходять до каталогу та виконують там скрипт. Ця команда працює, але лише в тому випадку, якщо екран був приєднаний до того, як вона була створена. Оскільки я намагаюся автоматизувати процес створення екрана та запускати команди всередині нього, я хотів би уникнути необхідності приєднання та від'єднання в рамках сценарію. Я спробую запропонувати створити скрипт оболонки, що містить команди, які мені потрібно виконати на екрані та відредагувати відповідно до моїх результатів.

Чи є спосіб створити екран і запустити команду всередині екрана або однією командою, або без необхідності приєднання до екрана після створення, але перед виконанням команди?

Заздалегідь спасибі.

** Оновлення - спробувавши пропозицію розмістити команди, які мені потрібно виконати в сценарії оболонки, я зміг успішно створити екран і виконати команди зсередини екрана, але я отримую поведінку, що коли сценарій перестає працювати екран також закривається. Це не повинно бути проблемою, оскільки скрипт - це сценарій реєстрації, який повинен зупинятися лише при знанні адміністратора sys або через скрипт, який я намагаюся розробити, проте бажано мати налаштування екрана таким чином, щоб екран не зникає, якщо сценарій зупинено. Чи можна досягти такої поведінки? **


1
Я зіткнувся з цією самою проблемою і знайшов рішення на superuser.com для всіх, хто натрапляє на цю проблему superuser.com/questions/342463/…
Ден Герберт

Щоб утримати екран відкритим, ви можете використовувати щось на кшталт: screen bash -c 'echo "test"; / bin / bash '
gwyn

1
Для вашої проблеми з автоматичним закриттям ви можете використовувати спеціальну, .screenrcщо містить рядок zombie kr, який буде тримати відкрите вікно, і ви можете натиснути, kщоб закрити winodw, або rзапустити команду у вікні ще раз. У мене це є за замовчуванням .screenrc.
Мартін К.

Відповіді:


18

Я думаю, що ви можете зіткнутися з кількома проблемами.

Якщо команда закінчиться перед повторним приєднанням, екран вимкнеться. Ви можете демонструвати це за допомогою:

screen -d -m ls -l

Він запустить ls -lкоманду, але screen -listне відобразить її після закінчення екранного процесу.

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

screen -d -m bash -c "command1 ; command2 ; command3"

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

screen -d -m /path/to/script.sh

чи є спосіб отримати подібну поведінку без негайного від'єднання екрана? Скажіть, що я хочу розпочати сеанс ssh, а потім відключити відразу після; screen -d -m sshбуде від'єднано під час запрошення пароля до того, як буде здійснено сеанс.
яскрава зірка

Це не працює для мене. Заміна hte "commandN" декількома тривалими програмами не призводить до того, що нічого не з'явиться в screen -list. Крім того, це не називає екран, як намагається зробити ОП.
Серін

Я шукав запустити програму python, використовуючи цей метод. Я спробував створити сценарій sh, щоб запустити його, але не побачив екран у списку. Натомість я використав screen -d -m python EventGenerator.py, що спрацював чудово
Дан Циборовський - MSFT

1
Це, мабуть, повинно бути bash -c "commands"замістьbash "commands"
marcovtwout

Ти маєш рацію, має бути -c.
Xdg

9

Запустіть окремий екран

screen -dmS <screen name>

Виконати команду на створеному раніше окремому екрані

screen -S <screen name> -X stuff '<CMD>\n'

Так, вам потрібно ввести символ введення, щоб подати команду, інакше він просто додасть рядок на екран.

http://osdir.com/ml/gnu.screen/2003-09/msg00029.html


1
що таке "речі"?
Надав Б

stuffнасправді це команда, яка копіює і вставляє іншу команду в сеанс на екрані: stuff [string] Задайте рядок рядка у вхідний буфер поточного вікна. Це як команда "вставити", але із значно меншими накладними витратами. Без параметра на екрані буде запропоновано набрати рядок. Не можна вставляти великі буфери за допомогою команди "stuff". Він найбільш корисний для прив’язки ключів. Дивіться також "bindkey". [цитується з theterminallife.com/sending-commands-into-a-screen-session/]
alisa

2

Я раніше стикався з цією проблемою, це була помилка з реалізацією cygwin.

Що я зробив, це створити ".screenrc_detaching", маючи лише наступну команду

#detach
detach 

а потім запустіть екран із

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Тоді у вас є сеанс екрану, і його вже додано та від'єднано, і ви добре накачувати команди на нього.

Легко! : P


2

Це зробило роботу для мене, -cне працюючи

screen -d -m bash -c "command1; command2; command3"


1

Копіювальний спосіб тестування попередніх відповідей:

 # No sessions:
screen -ls

 # Returns immediately:
time screen -dmS screen_descritive_session_name  bash -c 'sleep 20; hostname >> /tmp/h'

 # New session present:
screen -ls

 # File with return of command was created :)
sleep 20; cat /tmp/h

Очікуваний результат повинен бути схожим на:

No Sockets found in /var/run/screen/S-yourusernamehere.

(Це означає, що раніше не було створено сеансів на екрані)

real    0m0.002s
user    0m0.000s
sys     0m0.000s

(Це час, витрачений на створення екрана та від'єднання від нього. Майже миттєво.)

There is a screen on:
    20318.screen_descritive_session_name    (20/08/2018 16:29:35)   (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.

(Цей вихідний екран показує сеанси. Створено за останньою командою.)

sleep 20; cat /tmp/h

(Це catпоказує ім'я хоста, виконане всередині gnu-екрану)


і який результат таких тестів?
Pierre.Vriens

Ви маєте рацію, прикладу не було. Додам.
Енріке С. Філіаж

набагато краще! мерсі! +1
Pierre.Vriens

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