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

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

Примерно то, о чем говорится в названии:

Мой скрипт оболочки должен

  • Запустите команду A, дождитесь завершения.
  • запустить "экран"
  • выполнить команду B1 на начальном экране
  • открыть новое окно (обычно через Cmd-ac)
  • выполнить команду B2 в новом окне
  • открыть новое окно
  • выполнить команду B3 в новом окне

Вот и все, не нужно ждать, пока некоторые (или все) будут сделаны, хотя это дало бы бонусные баллы. Как я мог это сделать?

решение1

Запустите фоновый screenсеанс с именем «mysession»:

screen -d -m -S mysession

Запустить topв первом окне

screen -S mysession -X exec top

Откройте еще одно окно, назовите его «win1» и запустите vmstat 10в нем « »

screen -S mysession -X screen -t win1
screen -S mysession -p win1 -X exec vmstat 10

Откройте еще одно окно, назовите его «win2» и запустите iostat 30в нем « »

screen -S mysession -X screen -t win2 
screen -S mysession -p win2 -X exec iostat 30

Чтобы подключиться и посмотреть сеанс:

screen -x -S mysession

Если какая-либо из программ завершит работу, окно не закроется, поскольку screenв каждой из них будет запущена оболочка (которую вы можете использовать при необходимости).

- ИЛИ -Если вам нужна только одна команда на окно или вы хотите упростить очистку после завершения процессов, не запускайте оболочку по умолчанию в каждом окне, а только команду(ы):

screen -d -m -S mysession top
screen -S mysession -p 0 -X title win0    # optional!
screen -S mysession -X screen -t win1 vmstat 10
screen -S mysession -X screen -t win2 iostat 30

screen«завершит» окно (возможно, оставив содержимое окна нетронутым, см. zombieниже) при завершении процесса или для его завершения:

screen -S mysession -X quit   # nuke whole the session

или

screen -S mysession -p win2 -X kill
screen -S mysession -p win1 -X kill
screen -S mysession -p 0 -X kill

(это может завершить или не завершить какие-либо запущенные процессы, screenно каждому из них будет отправлен сигнал SIGHUP)

Если вы хотите screenавтоматически закрывать окна и выходить после завершения всех процессов, добавьте это после создания сеанса (хотя, если вы не установили это zombieв своем .screenrc, это, вероятно, в любом случае значение по умолчанию):

screen -S mysession -X zombie

Это отменяет «зомби»-клавиши закрытия и воскрешения, окна затем исчезают, когда команда в каждом окне завершается, и screenсамо закрывается, когда завершается последнее окно. (Возможно, вам придется использовать defzombieвместо zombie, но у меня работает только последний вариант, несмотря на противоположное в документации.)

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