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