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

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

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

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

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

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

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

решение1

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

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

screen -d -m ls -l

Команда будет выполнена ls -l, но screen -listне будет отображена, поскольку процесс screen завершен.

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

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

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

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

решение2

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

screen -dmS <screen name>

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

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

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

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

решение3

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

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

решение4

Способ проверки предыдущих ответов путем копирования и вставки:

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

Связанный контент