4

Я читаю Как я могу запустить несколько сеансов экрана автоматически?, но я не понимаю первый принятый ответ:

screen -dmS "$SESSION_NAME" "$COMMAND" "$ARGUMENTS"

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

  1. запустить экран
  2. введите команду
  3. CTRL+A
  4. CTRL+C
  5. введите команду
  6. CTRL+A
  7. CTRL+D

Как я могу сделать это автоматически в сценарии? Простой пример мне очень поможет.

Спасибо за ответы.

3 ответа3

2

screen -dm создает сеанс в фоновом режиме, выполняя указанную вами команду.

Так что если вы положите

screen -dm vi xxx
screen -dm vi yyy

в вашем скрипте у вас будет 2 сеанса, один из которых редактирует ххх и редактирует гггг.

screen -ls выведет список сеансов, к которым вы можете присоединиться, используя screen -r <session number>

Это не очень удобно, так как нужно найти номер сеанса. Вот где -S входит.

screen -dmS session1 vi xxx

создаст отдельный сеанс с именем session1, так что если вы измените свой скрипт на

screen -dmS session1 vi xxx
screen -dmS session2 vi yyy

Вы можете выбрать сессию, к которой хотите присоединиться, с помощью screen -r session1 или screen -r session2

1
  1. Запустите startup сессии и запустите в отдельном окне command1
  2. Добавить новое отдельное окно и запустить command2

    screen -dmS startup bash -c 'command1; exec bash'
    screen -S startup -x -X screen bash -c 'command2; exec bash'
    

Повторно подключите startup сеанса в любое время

screen -r startup
0

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

Второе легко, поэтому начнем с этого:

#!/bin/bash
command1
screen command2

Запуск "экрана" на экране создаст новое окно в текущем сеансе, а не начнет новое. Но он сразу же вернется, поэтому после последней строки сценарий завершится, пока command2 все еще выполняется. И когда команда2 завершена, ее окно закроется.

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

#!/bin/bash

# Need to positively identify the session name:
SESSION=mysession.$$
echo "TO ATTACH TO SESSION: screen -r ${SESSION}"

# For signalling and stuff
FLAGDIR=$(mktemp -d)

# To keep the windows around after the commands are done,
# set the "zombie" option (see the man-page)
echo "source $HOME/.screenrc" > ${FLAGDIR}/screenrc
echo "zombie xy" >> ${FLAGDIR}/screenrc

# Use that temporary screenrc; create a detached session:
screen \
    -c ${FLAGDIR}/screenrc \
    -d -m \
    -S ${SESSION} \
    bash -c "command1 ; touch ${FLAGDIR}/done"

# Wait for command1 to terminate
while [[ ! -f ${FLAGDIR}/done ]] ; do sleep 1 ; done

# Now start command2 in a new window, by sending a remote command:
screen -S $SESSION -X screen command2

# Don't need this any more:
rm -rf ${FLAGDIR}

Скрипт запустит command1 , подождите, пока это не будет сделано, затем запустите command2 и выйдите. Как будто вы запустите command1 ; command2 & , но с выводом в другом месте. Я уверен, что вы можете понять, как запустить command1 в фоновом режиме.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .