Создать экран и запустить команду без подключения

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', заключенным в кавычки, а не в одинарные кавычки. Это для того, чтобы смоделировать пользователя, нажимающего клавишу ввода, поскольку команды, которые я использую, перемещаются в каталог и выполняют сценарий, расположенный там. Эта команда работает, но только если экран был прикреплен после того, как он был создан. Поскольку я пытаюсь автоматизировать процесс создания экрана и запуска команд внутри него, я бы хотел избежать присоединения и отсоединения внутри скрипта. Я попытаюсь предложить сценарий оболочки, содержащий команды, которые мне нужно выполнить на экране и редактировать в соответствии с моими результатами.

Есть ли способ создать экран и запустить команду на экране в виде одной команды или без необходимости прикрепления к экрану после создания, но перед выполнением команды?

Заранее спасибо.

** Обновление - попробовав предложение поместить команды, которые мне нужно выполнить, в сценарий оболочки, я смог успешно создать экран и выполнить команды изнутри экрана, но у меня возникает такое поведение, когда скрипт перестает работать экран также закрывается. Это не должно быть проблемой, так как сценарий является сценарием регистрации, который должен останавливаться только на знаниях администратора системы или сценария, который я пытаюсь разработать, однако было бы предпочтительным настроить экран таким образом, чтобы экран не исчезает, если скрипт остановлен. Возможно ли добиться такого поведения? **

coffeecoder
источник
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, который работал отлично
Дэн Ciborowski - 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

Yogesh
источник
1
что такое "вещи"?
Надав Б
stuffна самом деле это команда, которая копирует и вставляет другую команду в сеанс экрана: stuff [string] Вставляет строку string во входной буфер текущего окна. Это похоже на команду «вставить», но с гораздо меньшими накладными расходами. Без параметра screen будет запрашивать строку для заполнения. Вы не можете вставлять большие буферы с помощью команды "stuff". Это наиболее полезно для привязки клавиш. Смотрите также «bindkey». [цитата из theterminallife.com/sending-commands-into-a-screen-session/]
Алиса
2

Я сталкивался с этой проблемой раньше, это была ошибка в реализации Cygwin.

Я создал файл «.screenrc_detaching», имеющий только следующую команду

#detach
detach 

а затем начать экран с

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

Затем у вас есть сеанс экрана, и он уже подключен и отключен, и вы можете подавать команды на него.

Легко ! :П

PiersyP
источник
2

Это сделало работу для меня, без -cне работал

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

Mazilu88
источник
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-screen)

Энрике С. Филиаже
источник
и каков результат таких испытаний?
Pierre.Vriens
Вы правы, примера не было. Я добавлю.
Энрике С. Филиадж
намного лучше! мерси! +1
Pierre.Vriens
0
screen -S test -d -m -- sh -c 'ls; exec $SHELL'
Надав Б
источник