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