Назад | Перейти на главную страницу

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

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

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

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

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

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

Я думаю, у вас может быть несколько проблем.

Если команда завершится до повторного подключения, экран исчезнет. Вы можете продемонстрировать это, используя:

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

Запустить отдельный экран

screen -dmS <screen name>

Выполнить команду на ранее созданном отдельном экране

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

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

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

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

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

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

Я создал ".screenrc_detaching", используя только следующую команду

#detach
detach 

а затем запустить экран с

screen -c ~/loginScripts/tempScreenrc/.screenrc_detaching

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

Легко ! :П

Способ copy'n'paste проверить предыдущие ответы:

 # 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)

screen -S test -d -m -- sh -c 'ls; exec $SHELL'