6

Я написал скрипт (который не работает), который выглядит примерно так:

#!/bin/sh

screen -dmS "somename" somecommand

for i in {0..5}; do
    screen -dmS "name$i" anothercommand $i
done

По какой-то причине, если я копирую и вставляю это в терминал, он создает 7 отдельных сеансов экрана, как я и ожидал. Однако, если я запускаю его из скрипта, я получаю только первый сеанс «somename», когда запускаю screen -ls .

Изменить: Если то же самое может быть достигнуто другим способом (например, с несколькими окнами экрана вместо сессий), я бы также открыл эти решения. Спасибо!

4 ответа4

5

Я закончил тем, что взял этот вопрос в StackOverflow, где Брайан Джерард ответил на вопрос. Синтаксис цикла {0..5} зависит от bash (3.x+). По умолчанию моя система была настроена на запуск какой-либо другой оболочки из /bin/sh , поэтому я изменил свой резкий удар на #!/bin/bash и моя проблема была решена!

4

Зачем вам нужно открывать столько сеансов экрана? Вместо этого, почему бы вам не попробовать создать несколько окон (я имею в виду как часть окна терминала одного экрана) внутри одного сеанса экрана. Вы можете переключаться между ними с помощью ctrl-a 1 или 2 или 3 и т.д., В зависимости от того, сколько вы создали и хотите просмотреть вывод.

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

2

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

Вы можете создать один сеанс экрана с несколькими окнами, используя файл конфигурации screenrc . Экранная страница руководства рассказывает Вам все, но вот самые важные вещи, которые должны решить Вашу проблему:

Следующий screenrc создает сеанс экрана с 2 окнами. В одном окне будет запущен bash , в другом будет запущен python (интерактивно):

sessionname myscreensession
screen -t command1 0 bash
screen -t command2 1 python

Имя myscreensession отображается при выполнении screen -ls и может использоваться в качестве параметра для screen -r . Строка commandN задает имена окон в сеансе экрана. Числа (0 и 1) указывают, в каком окне нужно выполнить команду (вам не нужно использовать последующие числа).

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

screen -X screen -S myscreensession -t command3 2 python3

Это создаст новое окно с запущенным python3 в существующем сеансе.

0

Я на самом деле не знаю, почему ваш скрипт не работает, но другой способ запустить несколько сеансов экрана - это создать специальный файл конфигурации экрана. Это обсуждалось в этом вопросе AskUbuntu: https://askubuntu.com/questions/49245/start-multiple-apps-running-in-shells-split-in-one-console

Я думаю, вы могли бы просто создать конфигурационный файл test.conf со следующим содержимым и запустить screen -d -c test.conf

screen -S "somename" somecommand
screen -S "name1" anothercommand 1
screen -S "name2" anothercommand 2
...

И если это работает, то ваш скрипт может сначала создать этот файл test.conf и настроить его в цикле с помощью

echo "screen -S "name$i" anothercommand $i" >> test.conf

и затем запустите screen -d -c test.conf в конце скрипта.

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