Сценарій оболонки: запустіть екран, відкрийте кілька екранів і виконайте команду в кожному


1

Досить багато, що говорить назва:

Мій сценарій оболонки повинен

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

Це все, не потрібно чекати, коли деякі (або всі) будуть зроблені, хоча це дасть бонусні бали. Як я міг це зробити?


Зробіть собі послугу, перейдіть tmuxз screen, набагато краще термінальний мультиплексор. Відповідь на ваше запитання: unix.stackexchange.com/a/152740
Alex

Відповіді:


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, але для мене працює лише останній, незважаючи на те, що документація суперечить.)


Чудова відповідь. Для повноти, якщо я хотів запустити більше однієї команди в одному вікні одного екрана, я можу поставити її куди завгодно, і вона стане в черзі, коли попередня команда, пов’язана з вікном, закінчиться?
FooBar

Якщо ви робите це за допомогою декількох screen -X execвикликів, програми запускатимуться одночасно в одному і тому ж вікні, що зазвичай не те, що ви хочете ;-) Спробуйте щось подібне screen -S mysession -X screen -t win1 -X sh -c "command1; command2"запускати їх послідовно.
mr.spuratic
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.